ruby-on-rails - 如何在 Ruby 中存根请求/响应
问题描述
使用 RSpec 的模拟/存根,我如何为该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"}
])
如果你想存根实际请求/响应。
您可以像这样子库的get
方法Excon
:
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"}]'
))
推荐阅读
- spring-security-oauth2 - Zuul 网关未携带授权标头
- php - 如何在创建方法 laravel6 后重定向用户?
- batch-file - 批处理文件findstr,如何?
- html - How to merge two forms into one?
- c# - 为什么 SQL Server XML 数据类型会在插入和检索时更改数字签名块中特定属性的顺序?
- c# - Swagger C# 枚举生成 - 基础 int 值与原始枚举不匹配
- c# - 无法在 xamarin android 中覆盖 AttachBaseContext()
- android - Xamarin Android 海关状态升级到 Visual Studio 2019 后无法正常工作
- android - 存储到firebase数据库后如何禁用其他人的复选框值?
- xml - 用于声明命名空间的 XQuery 语法:[XPST0081] 没有为 'text:p' 声明命名空间