从工厂女孩返回模拟对象
-
09-09-2019 - |
题
我在 JRuby Rails 应用程序中使用 Mocha 和 Factory_girl。当我调用工厂时,我想返回已经完成一些模拟的对象。这是我正在尝试做的事情的代码片段。
Factory.define :tweet_feed_with_tweets, :parent => :tweet_feed do |t|
t.expects(:pull_tweets).returns([Factory.build(:status),Factory.build(:status)])
end
因为我不希望我的单元和功能测试实际从 twitter API 中提取,所以我想存根该方法,以便它返回我想要的内容。但是,这不起作用。该对象返回时没有完成任何存根。有没有一种方法可以在工厂女孩创建的对象返回给您之前对其进行存根操作?
解决方案
查看文档和源代码 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
不隶属于 StackOverflow