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
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.
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