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

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

19 голосов
/ 09 августа 2010

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

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

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

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

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

Ответы [ 2 ]

37 голосов
/ 21 марта 2012

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

14 голосов
/ 09 августа 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...