【问题标题】:How can I mock a Non-DB-Model and let it return a given list on call如何模拟非 DB 模型并让它在调用时返回给定列表
【发布时间】:2013-04-24 17:46:52
【问题描述】:

我有一个带有静态方法fetchCommentList 类。问题是,它不是 ActiveRecord 模型,但它通过 http 调用来获取数据。

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

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

我只能找到与 DB 一起玩的模拟宝石。

我是不是完全忽略了什么?

【问题讨论】:

    标签: ruby-on-rails rspec mocking


    【解决方案1】:

    如果您使用的是 rspec,应该很容易做到这一点:

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

    或者让它更像是一种期望:

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

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

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

    【讨论】:

    • 太棒了,#stub 方法正是我搜索的。不知道为什么我没有找到它。 VCR 的想法听起来很有趣。会查的
    猜你喜欢
    • 2019-07-30
    • 1970-01-01
    • 2021-09-23
    • 2019-01-06
    • 1970-01-01
    • 2011-02-10
    • 2014-04-01
    • 1970-01-01
    • 2020-01-29
    相关资源
    最近更新 更多