Stub Httparty调用:参数数量错误(给定2,应为1)



我创建了一个简单的ruby文件(而不是Rails(,并尝试测试(使用Rspec(一个调用API的方法。在测试中,我试图通过WebMock模拟调用,但它一直给我这个错误:

Requests::FilesManager#display fetches the files from the API
Failure/Error: Requests::FilesManager.new.display

ArgumentError:
wrong number of arguments (given 2, expected 1)

文件为:

#run.rb
module Requests
require "httparty"
require 'json'
class FilesManager
include HTTParty
def initialize
end
def display
response = HTTParty.get('https://api.publicapis.org/entries', format: :json)
parsed_response = JSON.parse(response.body)
puts "The secret message was: #{parsed_response["message"]}"
end
end
end

和规范文件:

require 'spec_helper'
require_relative '../run'
RSpec.describe Requests::FilesManager do
describe "#display" do
it 'fetches the files from the API' do
stub_request(:get, "https://api.publicapis.org/entries").
to_return(status: 200, body: "", headers: {})
Requests::FilesManager.new.display
end
end
end

编辑:因此,错误似乎来自以下行:

JSON.parse(response.body)

如果我把它评论掉,它就会消失。那么问题是,调用的输出不是json(即使在调用HTTParty时使用format: :json(。我尝试了其他解决方案,但在生成json响应时似乎没有任何效果。它只是一根绳子。

更改

response = HTTParty.get('https://api.publicapis.org/entries', format: :json)

response = HTTParty.get('https://api.publicapis.org/entries')

我认为您不需要format: :json,当您将响应显式格式化为JSON时,情况就更糟了。

您需要在存根响应的body参数中返回一个json对象:

例如:对于空响应:

stub_request(:get, "https://api.publicapis.org/entries").
to_return(status: 200, body: "".to_json, headers: {})

或者对于有效的响应:(注意:您可能需要json才能将哈希转换为json(

require 'json'
...
stub_request(:get, "https://api.publicapis.org/entries").
to_return(status: 200, body:  { entries: { '0': { message: "Hello World" } } }.to_json, headers: {})

已解决!

  1. 似乎有一个错误,因为HTTParty使用的jsongem版本太旧了。

  2. 转到RestClientgem进行RESTful API调用。它在mimegem版本控制中发生了另一个冲突。

  3. 最后转到Faraday,这解决了我的问题:

JSON.parse(response.body, :quirks_mode => true)

tl;dr也遇到了同样的问题,最终不得不升级webmock。

长格式:

Webmock将中间件插入到您的调用中,因此当HTTParty进行调用时,它们最终会首先通过Webmock接口。

您可以通过尝试独立调用(不使用所有rspec配置(来验证这一点:

bundle console
irb> require "httparty"
=> true
irb> httparty.get("https://google.com")

如果独立调用成功,那么问题就在Webmock本身的某个地方。

对我来说,通过Webmock调用的某个地方是一个过时的接口,它不兼容,并引发了错误的参数数错误。这也破坏了我的调试器(RubyMine(。

升级Webmock解决了这个问题(因为他们在较新版本中修复了这个问题(。

相关内容

  • 没有找到相关文章

最新更新