【问题标题】:How to write proper tests when using an API wrapper that makes calls to a third party library?使用调用第三方库的 API 包装器时如何编写正确的测试?
【发布时间】:2014-07-15 20:24:23
【问题描述】:

我刚刚进入 RSpec 并在 Ruby 中进行适当的单元测试。 在我当前的项目中,我需要调用 Yelp API。 为了进行实际调用,我使用了 Yelp 的 yelpster API 包装器。

由于我是单元测试新手,我不确定在使用第三方 API 时如何正确编写测试。 我在webmock 上找到了许多教程,因为我使用的是包装器,所以不合适。

那么我应该如何进行测试,例如在编写一个应该返回一定数量的搜索结果的方法时?

显然我想消除对远程 API 的实际调用,例如可以在使用VCR 时完成,但在通过 HTTP POST/GET 直接访问 API 时似乎再次使用了这个库。

【问题讨论】:

    标签: ruby api unit-testing testing rspec


    【解决方案1】:

    使用RSpec's mocking library(或其他模拟库,如果您愿意)存根或模拟您对第三方库的调用。

    存根和模拟的正确使用是一个很大的话题,但通常当您从 API 中读取数据并希望为测试提供已知数据时,您会想要存根,并且当您“重新写入 API 并想要验证您是否进行了一些调用。乍一看,yelpster 看起来是只读的,因此您可能需要存根。

    如果需要一系列 API 调用(或只是 API 包装类上的方法调用)来完成一件有用的事情,请考虑将每个系列调用移动到 API 包装类(可以这么说)上的一个方法中。然后,您将拥有更少的存根方法。

    例如,使用 yelpster(从文档中复制)您需要这样做才能搜索:

    client = Yelp::Client.new
    request = Location.new(
      :address => '650 Mission St',
      :city => 'San Francisco',
      :state => 'CA',
      :radius => 2,
      :term => 'cream puffs')
    response = client.search(request)
    

    你可以把它包起来

    class YelpService
      def self.search(options)
        Yelp::Client.new.search(Location.new(options))
      end
    end
    

    并用存根

    YelpService.stub(:search) { "the response" }
    

    【讨论】:

    • 感谢@Dave 提供详细答案!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-18
    • 2017-05-08
    • 1970-01-01
    • 2011-06-11
    相关资源
    最近更新 更多