如何模拟非DB模型并让它在通话时返回给定列表

时间:2013-04-24 17:46:53

标签: ruby-on-rails rspec mocking

我有一个CommentList类,其中包含静态方法fetch。问题是,它不是ActiveRecord模型,而是进行http调用以获取数据。

class CommentList
  def self.fetch
    # http-foo here
    return ['some', 'data']
  end
end

现在我希望其他模型使用此fetch方法并模拟CommentList#fetch方法以返回我的规范中的给定数据集。

我只能找到与数据库一起玩的嘲笑宝石。

我完全忽视了什么吗?

1 个答案:

答案 0 :(得分:1)

如果您正在使用rspec,那么应该很容易做到这样:

CommentList.stub(:fetch => ['some', 'data'])

或使其更具期待性:

CommentList.should_receive(:fetch).and_return(['some', 'data'])

另一个更精细的解决方案是设置VCR。基本上它在这种情况下的作用是第一次运行测试时,CommentList会真正击中外部http服务并获取数据。 VCR然后保存该响应,从那时起,它返回缓存的响应。

好消息是,如果您想重新测试外部API调用(可能是他们的API已更改?),您只需删除VCR保存的数据,运行测试,您的测试将再次针对外部服务和缓存运行新数据。