2016-06-22 5 views
1

In einer Sinatra-Anwendung, ich versuche, meinen eigenen Wrapper um Net::HTTP zu machen, aber ich bin bei einem meiner Tests fest. Ich verwende Webmock, um eine Anfrage zu stubben und an die request-Methode von Net::HTTP zu übergeben. Ich mache das Testen mit RSpec. Der Fehler Ich erhalte ist:falsche Anzahl von Argumenten in Net :: HTTP-Anfrage

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>' 

Linie 279 von net_http.rb (die erste Zeile des Stapels) ist:

method = request.method.downcase.to_sym 

, die innerhalb der Methode ist:

module WebMock 
    module NetHTTPUtility 

    def self.request_signature_from_request(net_http, request, body = nil) 
     ... 

die wird in Zeile 75 derselben Datei aufgerufen:

def request(request, body = nil, &block) 
    request_signature = WebMock::NetHTTPUtility.request_signature_from_request(self, request, body) 

Welches ist die Methode, die ich auf meinem Client anrufe. Das sind meine Dateien:

net_http.rb

class NetHttp 

    def initialize(client) 
    @client = client 
    end 

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

    private 

    attr_reader :client 

end 

net_http_spec.rb

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 

Der letzte Teil, wo ich ein Attribut hinzufügen, auf die Fliege einen anderen Fehler zu lösen war. Es fühlt sich ein bisschen wie ein schmutziger Hack an. Vielleicht gibt es einen besseren Weg, all dies zu tun, was mich auch davon abhält, das zu tun?

Und in meinem spec_helper.rb ich die Zeile hinzugefügt:

WebMock.disable_net_connect!(allow_localhost: true) 

ich den Inhalt des Antrags innerhalb der request Methode und alles scheint in Ordnung zu sein gelegt habe, habe ich auch verwendet, ein Doppel von Net::HTTPRequest anstelle eines Webmock Stub, aber ich bekomme den gleichen Fehler. Ich möchte den Client nicht stubben, weil das mein System im Test ist. Ich habe auch den Code der request Methode in den Ruby-Dokumenten betrachtet. Ich verstehe nicht ... wo kommt dieser Fehler her und wie löst man ihn?

+0

Versuchen Sie, rspec mit der Option -b auszuführen (standardmäßig rspec verbirgt Teile des Backtrace nicht aus Ihrer App, die Sie an der falschen Stelle aussehen lassen kann) –

+0

@FrederickCheung Ich habe die Fehlermeldung aktualisiert. –

+0

Sieht so aus, als ob Ihr gefälschtes Request-Objekt keine Methode hat, also ruft es die method Methode von Object auf, die tatsächlich ein Argument erwartet. –

Antwort

0

Sie müssen den Rückgabewert stub_request nicht so verwenden, wie Sie sind. Sie können eine Instanz von Net::HTTP::Request normal erstellen.

+0

Sorry, ich verstehe nicht ... Ich muss ein Anfrageobjekt an die Anfrage-Methode übergeben. Die Art, wie es in der Produktion erstellt wird, ist wie folgt: 'request = Net :: HTTP :: Get.new VERIFY_URL.request_uri', aber wenn ich das überlasse, warnt mich Webmock, dass Real-HTTP-Verbindungen deaktiviert sind. Ich möchte keine Aufrufe von 'new' innerhalb der Methode haben, weil ich die Abhängigkeitsinjektion verwenden möchte. –

+0

Webmock-Dokumente schlagen vor, dass sollte in Ordnung sein. Vielleicht stößt du die Anfrage falsch an? (Z. B. was ist VERIFY_URL) –

+0

VERIFY_URL ist eine Zeichenfolge, die ein URI-Objekt mit der URL enthält, mit der ich eine Verbindung herstellen möchte.Ich verstehe, dass webmock Anfragen an diese URL abfängt und die Antwort zurückgibt. –

Verwandte Themen