Quelle est la différence entre eq
et eql
dans les tests rspec? Y a-t-il une différence entre:
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
et:
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
Il y a ici des différences subtiles, basées sur le type d'égalité utilisé dans la comparaison.
De la documentation Rpsec:
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
utilise l'opérateur ==
pour la comparaison et eql
ignore les conversions de type.
Les différences sont subtiles .eq
est identique comme l'implémentation Ruby de ==
et eql
est identique à l'implémentation Ruby de eql?
comme indiqué dans rspec-expectaion gem.
eq
vérifie l'équivalence d'objet et transtypera le type en transformant un objet différent en un même type . Deux objets sont équivalents s'ils appartiennent à la même classe et ont la même valeur mais qu'ils ne sont pas essentiellement le même objet.
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
vérifie l'équivalence d'objet et n'essaie pas de transtypage.
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
vérifie l'identité de l'objet . Deux objets sont identiques s'ils sont identiques, ce qui signifie qu'ils ont le même identifiant d'objet (partagent la même adresse en mémoire).
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