我在一个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创建的对象执行stubing?

最佳答案

查看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设置一个期望值。
我希望这能有所帮助。

关于ruby - 从工厂女孩返回模拟对象,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/588466/

10-16 19:47