Ответ 1
equal
проверяет, совпадает ли ссылка. Это соответствует методу Object#equal?
. Вы хотите использовать ==
для сравнения этих объектов.
Из того, что я понял, метод equal проверяет, является ли объект одинаковым.
person = Person.create!(:name => "David")
Person.find_by_name("David").should equal(person)
Это должно быть правдой.
Но здесь нет двух разных объектов?
Как два объекта могут быть одинаковыми? Я этого не понимаю.
equal
проверяет, совпадает ли ссылка. Это соответствует методу Object#equal?
. Вы хотите использовать ==
для сравнения этих объектов.
Тесты равенства Rails и RSpec имеют множество вариантов.
Rails 3.2 ActiveRecord:: Base использует разделитель равенства ==
.
Он возвращает true двумя разными способами:
self
- это тот же самый точный объект, что и объект сравненияself
- это тот же тип, что и объект сравнения, и имеет тот же идентификаторОбратите внимание, что ActiveRecord:: Base имеет метод ==
, который псевдоним как eql?
. Это отличается от типичных объектов Ruby, которые иначе определяют ==
и eql?
.
RSpec 2.0 имеет эти соответствия равенства в rspec-ожиданиях:
a.should equal(b) # passes if a.equal?(b)
a.should eql(b) # passes if a.eql?(b)
a.should == b # passes if a == b
RSpec также имеет два совпадения равенства, предназначенные для того, чтобы иметь больше чувства DSL к ним:
a.should be(b) # passes if a.equal?(b)
a.should eq(b) # passes if a == b
В вашем примере вы создаете запись, а затем находите ее.
Итак, у вас есть два варианта тестирования #find_by_name
:
Чтобы проверить, ищет ли он тот же самый объект или эквивалентную запись Person с тем же идентификатором, используйте should ==
или его эквивалент a.should eql
или его версию DSL should eq
Чтобы проверить, использует ли тот же самый объект NOT эквивалентную запись Person с тем же идентификатором, используйте should equal
или версию DSL should be