В моем случае у меня есть функция обратного вызова, загружающая что-то в мой 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_girl), где вы, вероятно, можете определить тот же обратный вызов и вернуть false
в соответствии с 'Отмена обратных вызовов 'раздел этой статьи . (Я не уверен в порядке, в котором выполняется обратный вызов, поэтому я не выбрал этот вариант).
Наконец, (извините, я не могу найти статью) Ruby позволяет вам использовать грязное метапрограммирование, чтобы отцепить ловушку обратного вызова (вам придется ее сбросить). Я думаю, это будет наименее предпочтительный вариант.
Ну, есть еще одна вещь, не совсем решение, но посмотрим, сможете ли вы обойтись без Factory.build в ваших спецификациях, вместо того, чтобы фактически создавать объект. (Было бы проще всего, если вы можете).