2016-06-22 5 views
1

Sinatra 응용 프로그램에서 Net::HTTP 주위에 자체 래퍼를 만들려고하지만 내 테스트 중 하나가 멈추었습니다. 요청을 스텁하고 request 메서드 (Net::HTTP)로 전달하기 위해 Webmock을 사용하고 있습니다. 나는 RSpec으로 테스트를한다. 내가 갖는 오류 :Net :: HTTP 요청의 잘못된 인수 수

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

라인 net_http.rb 279 (스택의 첫 번째 줄)입니다 : 방법 내부

method = request.method.downcase.to_sym 

:

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 

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 

마지막 부분 비행은 다른 오류를 해결하는 것이었다에 내가 속성을 추가 :이 내 파일입니다. 그것은 더러운 해킹과 같은 느낌입니다. 어쩌면이 모든 것을 할 수있는 더 좋은 방법이있을 것입니다. 그렇게하면 저도 그렇게하지 못할 것입니다.

그리고 내 spec_helper.rb에서

내가 줄 추가 : 나는 request 방법 내부 요청의 내용을 넣어 가지고 모든 것이 확인 될 것으로 보인다

WebMock.disable_net_connect!(allow_localhost: true) 

을, 나 또한의 두 배를 사용했다 Net::HTTPRequest 대신 webmock 스텁을 사용하지만 동일한 오류가 발생합니다. 그것이 테스트중인 내 시스템이기 때문에 클라이언트를 스텁 싶지 않습니다. 또한 Ruby 문서에서 request 메서드의 코드를 살펴 보았습니다. 나는 이해하지 못한다 ... 그 오류가 어디서오고 어떻게 해결할 수 있는가?

+0

rspec을 -b 옵션과 함께 실행 해보십시오. (기본적으로 rspec은 잘못된 곳을 볼 수있는 앱이 아닌 백 트레이스의 일부를 숨 깁니다.) –

+0

@FrederickCheung 오류 메시지를 업데이트했습니다. –

+0

당신의 가짜 요청 객체는'method' 메소드를 가지고 있지 않으므로 실제로 메소드에서 메소드를 호출합니다. 실제로는 인수를 기대합니다. –

답변

0

반환 값을 그대로 사용하지 않아도됩니다. stub_request. 정상적으로 Net::HTTP::Request의 인스턴스를 생성 할 수 있습니다.

+0

죄송합니다, 이해가 안되네요 ... 요청 객체에 요청 객체를 전달해야합니다. 프로덕션 환경에서 생성되는 방식은'request = Net :: HTTP :: Get.new VERIFY_URL.request_uri'와 같습니다. 그러나이를 통과하면 Webmock은 실제 HTTP 연결이 해제되었음을 알립니다. 의존성 주입을 사용하고 싶기 때문에 메서드 내에서'new '에 대한 호출을 원하지 않습니다. –

+0

Webmock docs가 좋습니다. 아마도 요청을 잘못 스텁하고있을 것입니까? (예 : VERIFY_URL은 무엇입니까?) –

+0

VERIFY_URL은 연결하려는 URL이 포함 된 URI 개체가 포함 된 문자열입니다.나의 이해는 webmock이 그 URL에 대한 요청을 잡아서 스텁 된 응답을 반환한다는 것이다. –