如何在Ruby中存根请求/响应



使用RSpec的mock/stub,如何为find_by_id方法编写单元测试?

我想使用RSpec,而不是WebMock或VCR。如何为请求/响应创建存根?

class RapidApiClient
HOST_URL = 'https://brianiswu-open-brewery-db-v1.p.rapidapi.com/breweries'
API_KEY  = 'private_api_key'
def request_api(url)
Excon.get(
url,
headers: {
'X-RapidAPI-Host' => HOST_URL,
'X-RapidAPI-Key' => 'API_KEY'
}
)
end
def find_by_id(id)
response = request_api("#{HOST_URL}/#{id}")
return nil if response.status != 200
JSON.parse(response.body)
end  
end

答案是:

[
{"id":4 , "name":"Ban Brewing Company" , "brewery_type":"micro", "city":"Tulsa" , "state":"OK"}
{"id":44,"name":"Tab Brewing" "brewery_type":"micro", "city":"Birmingham", "state":"MO"}
]

您可以存根request_api方法本身,这样您就不必使用以下内容发出HTTP请求:

expect_any_instance_of(RapidApiClient)
.to receive(:request_api)
.and_return([
{"id":4 , "name":"Ban Brewing Company" , "brewery_type":"micro", "city":"Tulsa" , "state":"OK"}
{"id":44,"name":"Tab Brewing" "brewery_type":"micro", "city":"Birmingham", "state":"MO"}
])

如果您想要存根actaul请求/响应。

你可以将Excon库的get方法分为这样的:

expect(Excon)
.to receive(:get)
.and_return(Excon::Response.new(
:status => 200,
:body => '[{"id":4 , "name":"Ban Brewing Company","brewery_type":"micro", "city":"Tulsa" , "state":"OK"},{"id":44,"name":"Tab Brewing" "brewery_type":"micro", "city":"Birmingham", "state":"MO"}]'
))

最新更新