Возвращение макетов от девушки с фабрики
-
09-09-2019 - |
Вопрос
Я использую Mocha и Factory_girl в железнодорожном приложении JRuby.Когда я звоню на фабрику, я хотел бы вернуть предметы уже с некоторыми издевательствами.Вот фрагмент кода того, что я пытаюсь сделать.
Factory.define :tweet_feed_with_tweets, :parent => :tweet_feed do |t|
t.expects(:pull_tweets).returns([Factory.build(:status),Factory.build(:status)])
end
Поскольку я не хочу, чтобы мой модульный и функциональный тест фактически извлекался из API Twitter, я хочу заглушить метод, чтобы он возвращал то, что я хочу.Но это не работает.Объект возвращается без каких-либо заглушек.Есть ли способ на самом деле выполнить заглушку объекта, созданного с помощью Factory Girl, прежде чем он будет возвращен вам?
Решение
Глядя на документацию и исходный код для factory_girl
, похоже, что объект отдан блоку (t
, в вашем примере) является экземпляром Factory
а не экземпляр объекта, который вы хотите создать (теперь tweet_feed_with_tweets
, в вашем примере).Это означает, что установка ожидания pull_tweets
метод на t
возлагает надежды на Factory
экземпляр, а не объект, который будет создан при вызове Factory(:tweet_feed_with_tweets)
.Я думаю, это объясняет, почему ваш пример не работает так, как вы ожидаете.
Возможно, я ошибаюсь, но я не вижу способа добавить ожидание в Factory.define
блокировать.Вы, наверное, уже подумали об этом, но я думаю, вам лучше добавить ожидание в тест после того, как вы создали экземпляр:
def test_should_do_something
tweet_feed = Factory(:tweet_feed)
tweet_feed.expects(:pull_tweets).returns([Factory.build(:status), Factory.build(:status)])
# test stuff here
end
Если вам это нужно в нескольких местах, вы можете извлечь его в метод: -
def test_should_do_something
tweet_feed = build_tweet_feed_with_tweets
# test stuff here
end
private
def build_tweet_feed_with_tweets
tweet_feed = Factory(:tweet_feed)
tweet_feed.expects(:pull_tweets).returns([Factory.build(:status), Factory.build(:status)])
return tweet_feed
end
Еще пара мыслей:-
- Я думаю, что устанавливать ожидания в таком укромном месте, в любом случае, вероятно, плохая идея.
- Если вы собираетесь это сделать, я бы подумал, используя
stubs
было более уместно, чемexpects
. - Возможно, стоит разделить
pull_tweets
метод (и любые подобные методы) вTwitterAPI
сорт.Таким образом, не так уж и плохо, что вам нужно установить ожидание наTwitterAPI
в тесте.
Надеюсь, что-то из этого поможет.
Другие советы
Обратные звонки теперь доступны:
Factory.define :tweet_feed_with_tweets, :parent => :tweet_feed do |t|
t.after_build do |tt|
tt.expects(:pull_tweets).returns([Factory.build(:status),Factory.build(:status)])
end
end