我在 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

其他一些想法:-

  1. 我认为无论如何,在如此隐蔽的地方设定期望可能是一个坏主意。
  2. 如果你打算这样做,我会考虑使用 stubs 比更合适 expects.
  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
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top