5

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、路径名、字符串、数组]。'哈希'给出'。response_body 的正确格式是什么?如果我把它变成一个 json,我就不能在我的代码中对对象做 response.content。

4

3 回答 3

3

您正在传递一个哈希作为预期的响应,而 Webmock 不知道应该将其编码为什么(请参阅此 Webmock 问题)。正如您所提到的,您可以使用response_body.to_json,但是您将无法使用点符号来访问数据。

由于您使用的是 RSpec,我会使用Test Doubles来假装您有一个Sawyer::Resource对象:

response_body = 
  [
    double("Sawyer::Resource",
      {
        :name=>"code.py",
        :content => "some content"
      })
  ]

然后,您应该能够像使用实际响应一样使用点符号访问数据。

于 2016-06-15T11:16:34.083 回答
2

我遇到了这个确切的问题,最后通过删除 Octokit 客户端解决了这个问题。为了检查 Octokit 中的测试覆盖率,我按照此处的说明进行操作。

Octokit 请求都使用VCR进行了测试,因此假设您对它们的测试覆盖率感到满意,那么在您的应用程序中存根 Octokit::Client 是相当安全的。

于 2017-03-03T15:12:51.350 回答
2

您需要以字符串的形式提供 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 源代码,您可以看到他们如何在自己的测试中使用 Webmock。(该json_response()测试中调用的方法在helper.rb.)

于 2019-03-29T17:33:32.483 回答