Тестирование заглушки с обратным вызовом в связанной модели - PullRequest
0 голосов
/ 10 октября 2011

У меня есть две модели, связанные простым отношением один ко многим.

class Device
  has_many :events

  def notify!
    (...)
  end
end

class Event
  after_create :notify_device
  belongs_to :device

  private

  def notify_device
    device.notify!
  end
end

Device#notify! метод должен быть заглушен в тестах, так как в нормальном потоке он запускает связь с устройством, связанным через RS-232, что, очевидно, может быть недоступно в тестовой среде (не говоря уже о том, что об этом не следует уведомлять в тестах ).

Я пытался установить should_receive ожидание для device объекта, созданного FactoryGirl, но метод device, используемый в Event классе, возвращает другой объект, который не знает об этом ожидании.

Как написать тест rspec, который бы проверял тот факт, что #notify! вызывается на правильном устройстве?

Ответы [ 2 ]

0 голосов
/ 01 ноября 2011

Использование any_instance должно подойти, если в вашем тесте только одно устройство (так как должен быть написан хороший изолированный тест).

Или другой вариант - использовать обратный вызов на устройстве вместо Event:

class Device < ActiveRecord::Base
  has_many :events, :after_add => :notify!

  def notify!
    ...
  end
end

Это должно быть намного проще для установки ожиданий:

device = Device.new
device.should_receive(:notify!)
device.events << Event.create!

Еще один вариант, о котором я только что подумал (но не пробовал), - отключить метод, используемый активной записью.получить устройство во время создания события.Ниже я предполагаю, что это просто Device.find(device.id), но это может быть что-то еще.

device = Factory(:device)
device.should_receive(:notify!)
Device.stub(:find).with(device.id) { device }
Event.create!(:device => device)
0 голосов
/ 10 октября 2011

Я не вижу, как ожидать сообщения для данной записи AR. Вы можете добавить эту функцию в rspec или добавить регистратор для уведомления! Метод:

class Device

  def notify!(event)
    logger "Device with id '{self.id}' has been notified by event '#{event}'"
  end
end

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

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