我创建了一个简单的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: {})
已解决!
-
似乎有一个错误,因为
HTTParty
使用的json
gem版本太旧了。 -
转到
RestClient
gem进行RESTful API调用。它在mime
gem版本控制中发生了另一个冲突。 -
最后转到
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解决了这个问题(因为他们在较新版本中修复了这个问题(。