如何正确复制Octokit的响应主体请求webmock存根的响应

时间:2016-06-03 19:09:01

标签: ruby-on-rails rspec webmock octokit

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,那么我就不能对我的代码中的对象做响应。

3 个答案:

答案 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中。)