webentwicklung-frage-antwort-db.com.de

Rspec `eq` vs.` eql` in `Expect'-Tests

Was ist der Unterschied zwischen der Verwendung von eq und eql in rspec-Tests? Gibt es einen Unterschied zwischen:

it "adds the correct information to entries" do
  # book = AddressBook.new # => Replaced by line 4
  book.add_entry('Ada Lovelace', '010.012.1815', '[email protected]')
  new_entry = book.entries[0]

  expect(new_entry.name).to eq('Ada Lovelace')
  expect(new_entry.phone_number).to eq('010.012.1815')
  expect(new_entry.email).to eq('[email protected]')
end

und:

it "adds the correct information to entries" do
  # book = AddressBook.new # => Replaced by line 4
  book.add_entry('Ada Lovelace', '010.012.1815', '[email protected]')
  new_entry = book.entries[0]

  expect(new_entry.name).to eql('Ada Lovelace')
  expect(new_entry.phone_number).to eql('010.012.1815')
  expect(new_entry.email).to eql('[email protected]')
end
22
austinthesing

Hier gibt es geringfügige Unterschiede, basierend auf der Art der Gleichheit, die im Vergleich verwendet wird.

Aus den Rpsec-Dokumenten:

Ruby exposes several different methods for handling equality:

a.equal?(b) # object identity - a and b refer to the same object
a.eql?(b) # object equivalence - a and b have the same value
a == b # object equivalence - a and b have the same value with type conversions]

eq verwendet den ==-Operator zum Vergleich, und eql ignoriert Typkonvertierungen.

33
stef

Die Unterschiede sind subtil .eq ist gleich wie die Ruby-Implementierung von == und eql ist identisch mit der Ruby-Implementierung von eql?, wie auf rspec-expectaion gem erwähnt.

eq prüft die Äquivalenz von Objekten und wandelt den Typ um, um verschiedene Objekte in denselben Typ zu konvertieren .. Zwei Objekte sind gleichwertig, wenn sie dieselbe Klasse haben und denselben Wert haben, aber im Wesentlichen nicht dasselbe Objekt.

expect(:my_symbol).to eq(:my_symbol)
# passes, both are identical.
expect('my string').to eq('my string')
# passes, objects are equivalent 
expect(5).to eq(5.0)
# passes, Objects are not equivalent but was type casted to same object type. 

eql prüft die Äquivalenz von Objekten und versucht nicht, den Typ umzuwandeln.

expect(:my_symbol).to eql(:my_symbol)
# passes, both are identical.
expect('my string').to eql('my string')
# passes, objects are equivalent but not identical 
expect(5).to eql(5.0)
# fails, Objects are not equivalence, did not tried to type case

equal prüft die Objektidentität . Zwei Objekte sind identisch, wenn sie dasselbe Objekt sind, dh sie haben dieselbe Objekt-ID (teilen sich dieselbe Adresse im Speicher).

expect(:my_symbol).to equal(:my_symbol)
# passes, both are identical.
expect('my string').to equal('my string')
# fails, objects are equivalent but not identical
expect(5).to equal(5.0)
# fails, Objects are not equivalence and not identical
0
Faruk Hossain