Ruby Net::HTTP请求中的参数数目错误

Ruby Net::HTTP请求中的参数数目错误,ruby,http,rspec,sinatra,webmock,Ruby,Http,Rspec,Sinatra,Webmock,在Sinatra应用程序中,我试图围绕Net::HTTP制作自己的包装器,但我在一个测试中被卡住了。我正在使用Webmock存根一个请求,并将其传递给Net::HTTP的request方法。我用RSpec做测试。我得到的错误是: Failure/Error: client.request(request) ArgumentError: wrong number of arguments (given 0, expected 1) # /home/admin/.rbenv/versi

在Sinatra应用程序中,我试图围绕
Net::HTTP
制作自己的包装器,但我在一个测试中被卡住了。我正在使用Webmock存根一个请求,并将其传递给
Net::HTTP
request
方法。我用RSpec做测试。我得到的错误是:

 Failure/Error: client.request(request)

 ArgumentError:
   wrong number of arguments (given 0, expected 1)
 # /home/admin/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/webmock-2.1.0/lib/webmock/http_lib_adapters/net_http.rb:279:in `method'
 # /home/admin/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/webmock-2.1.0/lib/webmock/http_lib_adapters/net_http.rb:279:in `request_signature_from_request'
 # /home/admin/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/webmock-2.1.0/lib/webmock/http_lib_adapters/net_http.rb:75:in `request'
 # ./lib/net_http.rb:19:in `request'
 # ./spec/net_http_spec.rb:21:in `block (2 levels) in <top (required)>'
 # /home/admin/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/rspec-core-3.4.4/lib/rspec/core/example.rb:236:in `instance_exec'
 # /home/admin/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/rspec-core-3.4.4/lib/rspec/core/example.rb:236:in `block in run'
 # /home/admin/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/rspec-core-3.4.4/lib/rspec/core/example.rb:478:in `block in with_around_and_singleton_context_hooks'
 # /home/admin/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/rspec-core-3.4.4/lib/rspec/core/example.rb:435:in `block in with_around_example_hooks'
 # /home/admin/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/rspec-core-3.4.4/lib/rspec/core/hooks.rb:478:in `block in run'
 # /home/admin/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/rspec-core-3.4.4/lib/rspec/core/hooks.rb:616:in `run_around_example_hooks_for'
 # /home/admin/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/rspec-core-3.4.4/lib/rspec/core/hooks.rb:478:in `run'
 # /home/admin/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/rspec-core-3.4.4/lib/rspec/core/example.rb:435:in `with_around_example_hooks'
 # /home/admin/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/rspec-core-3.4.4/lib/rspec/core/example.rb:478:in `with_around_and_singleton_context_hooks'
 # /home/admin/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/rspec-core-3.4.4/lib/rspec/core/example.rb:233:in `run'
 # /home/admin/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/rspec-core-3.4.4/lib/rspec/core/example_group.rb:581:in `block in run_examples'
 # /home/admin/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/rspec-core-3.4.4/lib/rspec/core/example_group.rb:577:in `map'
 # /home/admin/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/rspec-core-3.4.4/lib/rspec/core/example_group.rb:577:in `run_examples'
 # /home/admin/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/rspec-core-3.4.4/lib/rspec/core/example_group.rb:543:in `run'
 # /home/admin/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/rspec-core-3.4.4/lib/rspec/core/runner.rb:119:in `block (3 levels) in run_specs'
 # /home/admin/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/rspec-core-3.4.4/lib/rspec/core/runner.rb:119:in `map'
 # /home/admin/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/rspec-core-3.4.4/lib/rspec/core/runner.rb:119:in `block (2 levels) in run_specs'
 # /home/admin/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/rspec-core-3.4.4/lib/rspec/core/configuration.rb:1680:in `with_suite_hooks'
 # /home/admin/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/rspec-core-3.4.4/lib/rspec/core/runner.rb:118:in `block in run_specs'
 # /home/admin/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/rspec-core-3.4.4/lib/rspec/core/reporter.rb:77:in `report'
 # /home/admin/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/rspec-core-3.4.4/lib/rspec/core/runner.rb:117:in `run_specs'
 # /home/admin/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/rspec-core-3.4.4/lib/rspec/core/runner.rb:93:in `run'
 # /home/admin/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/rspec-core-3.4.4/lib/rspec/core/runner.rb:78:in `run'
 # /home/admin/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/rspec-core-3.4.4/lib/rspec/core/runner.rb:45:in `invoke'
 # /home/admin/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/rspec-core-3.4.4/exe/rspec:4:in `<top (required)>'
 # /home/admin/.rbenv/versions/2.3.0/bin/rspec:23:in `load'
 # /home/admin/.rbenv/versions/2.3.0/bin/rspec:23:in `<main>'
方法中的:

module WebMock
  module NetHTTPUtility

    def self.request_signature_from_request(net_http, request, body = nil)
      ...
在同一文件的第75行中调用:

def request(request, body = nil, &block)
  request_signature = WebMock::NetHTTPUtility.request_signature_from_request(self, request, body)
这就是我对我的客户调用的方法。这些是我的文件:

net_http.rb

class NetHttp

  def initialize(client)
    @client = client
  end

  def request(request)
    client.request(request)
  end

  private

  attr_reader :client

end
describe "NetHttp" do

  let(:client)   {Net::HTTP.new(VERIFY_URL.host, VERIFY_URL.port)}
  let(:net_http) {NetHttp.new(client)}

  it "sends a get request" do
    request  = request_with_path
    response = net_http.request(request)
    expect(response.code).to eq("200")
  end

  def request_with_path
    request = stub_request(:get, VERIFY_URL)
      .with(:headers => {
        'Accept'=>'*/*',
        'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3',
        'User-Agent'=>'Ruby'
        })
      .to_return(:status => 200, :body => '{"hello": "world"}', :headers => {})

    class << request
      attr_accessor :path
    end

    request.path = VERIFY_URL.request_uri
    request
  end

end
net\u http\u spec.rb

class NetHttp

  def initialize(client)
    @client = client
  end

  def request(request)
    client.request(request)
  end

  private

  attr_reader :client

end
describe "NetHttp" do

  let(:client)   {Net::HTTP.new(VERIFY_URL.host, VERIFY_URL.port)}
  let(:net_http) {NetHttp.new(client)}

  it "sends a get request" do
    request  = request_with_path
    response = net_http.request(request)
    expect(response.code).to eq("200")
  end

  def request_with_path
    request = stub_request(:get, VERIFY_URL)
      .with(:headers => {
        'Accept'=>'*/*',
        'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3',
        'User-Agent'=>'Ruby'
        })
      .to_return(:status => 200, :body => '{"hello": "world"}', :headers => {})

    class << request
      attr_accessor :path
    end

    request.path = VERIFY_URL.request_uri
    request
  end

end


我将请求的内容放在
request
方法中,似乎一切正常,我还使用了
Net::HTTPRequest
的两倍,而不是webmock存根,但我得到了相同的错误。我不想存根客户端,因为这是我正在测试的系统。我还研究了Ruby文档中
请求
方法的代码。我不明白。。。该错误来自何处以及如何解决?

您不需要按原样使用
存根请求的返回值。您可以像平常一样构造
Net::HTTP::Request
的实例

您不需要按原样使用
存根请求的返回值。您可以像平常一样构造
Net::HTTP::Request
的实例

尝试使用-b选项运行rspec(默认情况下,rspec会隐藏回溯的部分内容,而不是隐藏在应用程序中,这会使您看起来不正确)@FrederickCheung我已更新错误消息。看起来你的假请求对象没有
方法
方法,因此它正在从对象调用
方法
方法,该对象确实需要一个参数。我沿着该路径走,但它只是不断地请求其他东西,像
body\u流
read
方法等。尝试使用-b选项运行rspec(默认情况下,rspec会隐藏回溯的部分,而不会隐藏在应用程序中,这可能会让你看错地方)@FrederickCheung我已更新错误消息。看起来你的假请求对象没有
方法
方法,因此它正在从对象调用
方法
方法,该对象确实需要一个参数。我沿着该路径走,但它只是不断地请求其他东西,像
body\u-stream
read
方法等等。对不起,我不明白。。。我需要向request方法传递一个request对象。在生产环境中创建它的方式是这样的:
request=Net::HTTP::Get.new VERIFY\u URL.request\u uri
,但是如果我通过了,Webmock会提醒我真正的HTTP连接被禁用。我不想在方法中调用
new
,因为我想使用依赖项注入。Webmock文档建议这样就可以了。也许你的请求有误?(例如什么是VERIFY_URL)VERIFY_URL是一个字符串,它包含一个URI对象,该对象具有我要连接的URL。我的理解是webmock将捕获对该URL的请求并返回存根响应。看起来这是一个实际的URI对象,可能不是webmock所期望的-文档暗示这只是一个字符串我终于理解了你的答案。当我执行
response=net\u http.request(request)
时,它会自动使用存根。因此,如果我删除测试的第一行和存根的赋值,它就会工作:)对不起,我不明白。。。我需要向request方法传递一个request对象。在生产环境中创建它的方式是这样的:
request=Net::HTTP::Get.new VERIFY\u URL.request\u uri
,但是如果我通过了,Webmock会提醒我真正的HTTP连接被禁用。我不想在方法中调用
new
,因为我想使用依赖项注入。Webmock文档建议这样就可以了。也许你的请求有误?(例如什么是VERIFY_URL)VERIFY_URL是一个字符串,它包含一个URI对象,该对象具有我要连接的URL。我的理解是webmock将捕获对该URL的请求并返回存根响应。看起来这是一个实际的URI对象,可能不是webmock所期望的-文档暗示这只是一个字符串我终于理解了你的答案。当我执行
response=net\u http.request(request)
时,它会自动使用存根。因此,如果我删除测试的第一行和存根的赋值,它就可以工作:)