В моем случае у меня есть обратный вызов, загружающий что-то в мой кеш Redis. Но тогда у меня не было / не нужно было запускать экземпляр Redis для моей тестовой среды.
after_create :load_to_cache
def load_to_cache
Redis.load_to_cache
end
Для моей ситуации, аналогичной описанной выше, я просто вставил свой load_to_cache
метод в свой spec_helper с помощью:
Redis.stub(:load_to_cache)
Кроме того, в определенной ситуации, когда я хочу проверить это, мне просто нужно отключить их в блоке before соответствующих тестовых случаев Rspec.
Я знаю, что у вас может происходить что-то более сложное, after_create
или это может показаться не очень элегантным. Вы можете попытаться отменить обратный вызов, определенный в вашей модели, определив after_create
ловушку в своем Factory (см. Документацию factory_girl), где вы, вероятно, можете определить тот же обратный вызов и возврат false
, согласно разделу «Отмена обратных вызовов» этой статьи . (Я не уверен в том, в каком порядке выполняются обратные вызовы, поэтому я не выбрал этот вариант).
Наконец, (извините, я не могу найти статью) Ruby позволяет вам использовать грязное мета-программирование, чтобы отцепить перехватчик обратного вызова (вам придется его сбросить). Думаю, это наименее предпочтительный вариант.
Что ж, есть еще одна вещь, на самом деле не решение, но посмотрите, сможете ли вы уйти с Factory.build в своих спецификациях вместо фактического создания объекта. (Было бы проще, если бы можно).
:on => :create
валидацию, используйтеafter(:build) { |user| user.class.skip_callback(:validate, :create, :after, :run_something) }