查看文档和源代码factory_girl
,看起来生成给块的对象(t
在您的示例中)是 a 的实例,Factory
而不是您要构造的对象的实例(tweet_feed_with_tweets
在您的示例中)。这意味着为pull_tweets
ont
方法设置期望值是在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
其他一些想法:-
- 我认为无论如何,在这样一个隐蔽的地方设定期望可能是个坏主意。
- 如果您要这样做,我会认为 using
stubs
比expects
.
pull_tweets
将方法(和任何类似的方法)分离到一个TwitterAPI
类中可能是值得的。这样一来,您需要在测试中设置期望值就不会那么糟糕了TwitterAPI
。
我希望其中一些有所帮助。