从工厂女孩返回模拟对象

问题描述:

我在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实际拉动我想存根方法,所以它返回我想要的。但是,这不起作用。该对象返回时没有任何残留。是否有办法在工厂女孩创建的对象返回给你之前实际上对其执行存根操作?

+0

你已经工作了答案了吗?我的回答有帮助吗? – 2009-03-04 17:10:02

看着为factory_girl文档&源代码,它看起来就像物体产生的块(t,在你的例子)是要构造对象的Factory,而不是一个实例的实例(tweet_feed_with_tweets ,在你的例子中)。这意味着在t上设置pull_tweets方法的期望值是设置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 

一对夫妇的其他想法: -

  1. 我觉得在这样一个隐藏起来的地方设置的预期可能是一个不好的想法。
  2. 如果你打算这样做,我会认为使用stubsexpects更合适。
  3. 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