Как проверить after_initialize обратный вызов модели рельсов? - PullRequest
6 голосов
/ 13 сентября 2011

Я использую FactoryGirl и Rspec для тестирования. Модель устанавливает внешний ключ после init, если он равен nil. Поэтому он использует данные другой ассоциации. Но как я могу это проверить? Обычно я использовал бы фабрику для создания этого объекта и использовал бы stub_chain для "self.user.main_address.country_id". Но при создании этого объекта после инициализации будет вызван. У меня нет шансов заглушить это.

after_initialize do
  if self.country_id.nil?
    self.country_id = self.user.main_address.country_id || Country.first.id
  end
end

Есть идеи?

Ответы [ 2 ]

8 голосов
/ 25 апреля 2012

В идеале лучше тестировать поведение, а не реализацию.Проверьте, что установлен внешний ключ, вместо того, чтобы проверять, что метод вызывается.

Хотя, если вы хотите проверить обратный вызов after_initialize, вот способ, который работает.

obj = Model.allocate
obj.should_receive(:method_here)
obj.send(:initialize)

Allocate помещает объект в память, но не вызывает initialize.После того, как вы установите ожидание, вы можете вызвать initialize и перехватить вызов метода.

5 голосов
/ 31 января 2016

Метод Орландо работает, и вот еще один, который я хотел бы добавить.(Используя новый синтаксис rspec «ожидайте»)

expect_any_instance_of(Model).to receive(:method_here)
Model.new
...