在使用调用第三方库的API包装器时如何编写正确的测试?

时间:2014-07-15 20:24:24

标签: ruby api unit-testing testing rspec

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

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

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

显然,我想取消对远程API的实际调用,例如可以在使用VCR时完成,但是当通过HTTP POST / GET直接访问API时,似乎也会使用此库。

1 个答案:

答案 0 :(得分:2)

使用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" }