Тесты на равенство 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
Чтобы проверить, использует ли он точно такой же объект НЕ эквивалентную запись Person с тем же идентификатором, затем используйте should equal
или его версию DSL should be