【问题标题】:Stub Httparty call: Wrong number of arguments (given 2, expected 1)存根 Httparty 调用:参数数量错误(给定 2,预期 1)
【发布时间】:2022-11-09 14:38:59
【问题描述】:

我创建了一个简单的 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 时似乎没有任何效果。它只是一个字符串。

【问题讨论】:

  • 问题不在于模拟,而在于这一行:Requests::MyCLI.new.display_filesRequests::MyCLI 是什么样的?它的 initializedisplay_files 方法是如何定义的?
  • 感谢您的回复。抱歉,我更新了@spickermann 错误。任何想法为什么它失败了?

标签: ruby-on-rails ruby rspec httparty webmock


【解决方案1】:

改变

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

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

我认为你不需要format: :json 更多,所以当你明确格式化对 JSON 的响应时。

【讨论】:

  • 感谢你的回答。我试过了,但错误不断出现..
  • 找到了错误的来源,但出现了另一个障碍,我更新了问题,希望有人能提供帮助
【解决方案2】:

您需要在存根响应的 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: {})

【讨论】:

  • 谢谢你的评论。试过了,但似乎没有用。。
  • 还创建了一个body,与它应该产生的结果完全相同,但它仍然失败
【解决方案3】:

解决了!

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

  2. 转到 RestClient gem 以进行 RESTful API 调用。它在mime gem 版本控制中有另一个冲突。

  3. 终于搬到Faraday,这解决了我的问题:

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

【讨论】:

    【解决方案4】:

    tl;博士有同样的问题,最终不得不升级 webmock。

    长表:

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

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

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

    如果该独立调用成功,则问题出在 Webmock 本身的某个地方。

    对我来说,通过 Webmock 调用的某个地方是一个过时的接口,它不兼容并引发了 Wrong Number of Arguments 错误。这也使我的调试器(RubyMine)崩溃。

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

    【讨论】:

    • 如果不是这种情况,请告诉我,我将删除答案以免混淆。
    猜你喜欢
    • 2018-12-02
    • 2020-12-12
    • 2020-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多