Octokit响应的类型为Sawyer::Response
他们看起来像这样:
{:name=>"code.py",
:content => "some content"}
我试图像这样存根我的请求
reponse_body = {:content => "some content"}
stub_request(:any, /.*api.github.com\/repos\/my_repo\/(.*)\/code.py/).to_return(:status => 200, :body => response_body)
在我的代码中,我然后调用response.content,所以我希望能够从响应中获取内容。
我目前收到错误:'WebMock :: Response :: InvalidBody:必须是以下之一:[Proc,IO,Pathname,String,Array]。 '哈希'给'。 response_body的正确格式是什么?如果我把它变成一个json,那么我就不能对我的代码中的对象做响应。
答案 0 :(得分:1)
我有这个确切的问题,最后通过剔除Octokit客户端解决了这个问题。为了检查Octokit中的测试覆盖率,我按照here的说明进行操作。
Octokit请求都是使用VCR进行测试的,因此假设您对其测试覆盖率感到满意,在您的应用程序中存储Octokit :: Client是相当安全的。
答案 1 :(得分:0)
您正在传递散列作为预期响应,而Webmock不知道应该将哪些内容编码为(see this Webmock issue)。如您所述,您可以使用response_body.to_json
,但是您将无法使用点表示法来访问数据。
由于你正在使用RSpec,我会利用Test Doubles假装你有Sawyer::Resource
个对象:
response_body =
[
double("Sawyer::Resource",
{
:name=>"code.py",
:content => "some content"
})
]
然后,您应该能够使用点符号访问数据,就像使用实际响应一样。
答案 2 :(得分:0)
您需要提供JSON正文作为字符串,以及适当的Content-Type标头。例如,对电话进行存根
Octokit::Client.new.user(user_login)
您需要类似的东西
stub_request(:get, "https://api.github.com/users/#{user_login}")
.to_return(
status: 200,
body: user_json, # a string containing the JSON data
headers: { content_type: 'application/json; charset=utf-8' }
)
(如果您不提供Content-Type标头,则Octokit不会尝试解析JSON,而您只需获取原始字符串即可。)
如果您查看Octokit source,可以看到他们在自己的测试中如何使用Webmock。 (该测试中调用的json_response()
方法在helper.rb
中。)