我刚刚进入RSpec并在Ruby中进行了适当的单元测试。 在我当前的项目中,我需要调用Yelp API。 要进行实际调用,我使用Yelp的yelpster API包装器。
由于我是单元测试的新手,我不确定在使用第三方API时如何正确处理编写测试。 我在webmock找到了一些教程,因为我使用的是包装器,所以它不适合。
那么我应该如何进行测试,例如在编写应返回一定数量搜索结果的方法时?
显然,我想取消对远程API的实际调用,例如可以在使用VCR时完成,但是当通过HTTP POST / GET直接访问API时,似乎也会使用此库。
答案 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" }