Подтвердить что ты не робот

Rspec равный метод

Из того, что я понял, метод equal проверяет, является ли объект одинаковым.

person = Person.create!(:name => "David")
Person.find_by_name("David").should equal(person)

Это должно быть правдой.

Но здесь нет двух разных объектов?

Как два объекта могут быть одинаковыми? Я этого не понимаю.

4b9b3361

Ответ 1

equal проверяет, совпадает ли ссылка. Это соответствует методу Object#equal?. Вы хотите использовать == для сравнения этих объектов.

Ответ 2

Тесты равенства 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