1

我在 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 中提取,所以我想存根该方法,以便它返回我想要的。但是,这是行不通的。对象在没有任何存根的情况下返回。有没有办法在工厂女孩创建的对象返回给您之前实际执行存根?

4

2 回答 2

6

回调现在可用:

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
于 2011-01-26T12:29:50.040 回答
1

查看文档和源代码factory_girl,看起来生成给块的对象(t在您的示例中)是 a 的实例,Factory而不是您要构造的对象的实例(tweet_feed_with_tweets在您的示例中)。这意味着为pull_tweetsont方法设置期望值是在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. 如果您要这样做,我会认为 usingstubsexpects.
  3. pull_tweets将方法(和任何类似的方法)分离到一个TwitterAPI类中可能是值得的。这样一来,您需要在测试中设置期望值就不会那么糟糕了TwitterAPI

我希望其中一些有所帮助。

于 2009-03-03T09:28:15.373 回答