2016-05-06 44 views
0

工作下面的代碼工作webmock 1.20.4但不能與2.0.1stub_request與承載授權頭不是webmock 2

stub_request(:get, "http://www.myapi.com/my-endpoint") 
     .with(headers: {'Authorization' => "Bearer fake_oauth_token"}) 
     .to_return(:body => mock_response) 

這是我磕碰的代碼。

def get_stuff(oauth_token) 
    faraday = Faraday.new(:url => "http://www.myapi.com/my-endpoint", :ssl => {verify: false}) 

    response = faraday.get do |req| 
     req.options[:timeout] = 10 
     req.headers['Authorization'] = "Bearer #{oauth_token}" 
    end 

    if response.status == 200 
     response.body 
    else 
     {error: "failed"}.to_json 
    end 
    end 

使用assert_requested :get, "http://www.myapi.com/my-endpoint", :headers => {'Authorization' => "Bearer fake_oauth_token"}, :times => 1和刪除stub_request我從斷言下面的輸出頭。

Failure/Error: assert_requested :get, "#{Conf.graphql[:host]}?query=#{graphql_user_details_query}", :headers => headers, :times => 1 

    The request GET http://www.myapi.com/my-endpoint with headers {'Authorization'=>'Bearer fake_oauth_token'} was expected to execute 1 time but it executed 0 times 

    The following requests were made: 

    GET http://www.myapi.com/my-endpoint with headers {'Accept-Encoding'=>'gzip, compressed', 'Authorization'=>'Basic QmVhcmVyIGZha2Vfb2F1dGhfdG9rZW4=', 'User-Agent'=>'Faraday v0.9.2'} was made 1 time 

有沒有辦法讓stub_request代碼和webmock 2一起工作?

回答

0

UPDATE:此問題是固定在WebMock 2.0.2

以下是已經過時。

WebMock 2.0使用Basic Autorization標頭覆蓋承載者授權標頭。我已經在webmock github頁面上報告了這個問題(https://github.com/bblimke/webmock/issues/617)。在問題解決之前,我們正在用猴子補丁來解決導致問題的線索。

我們在我們的spec_helper中創建了一個文件WebMockHttpClient.rb。這將註釋掉覆蓋承載者授權標頭的行。

require 'em-http-request' 

module EventMachine 
    class WebMockHttpClient 

    def build_request_signature 
     headers, body = @req.headers, @req.body 

     @conn.middleware.select { |m| m.respond_to?(:request) }.each do |m| 
     headers, body = m.request(self, headers, body) 
     end 

     method = @req.method 
     uri = @req.uri.clone 
     query = @req.query 

     uri.query = encode_query(@req.uri, query).slice(/\?(.*)/, 1) 

     body = form_encode_body(body) if body.is_a?(Hash) 

     headers = @req.headers 

     # if headers['authorization'] 
     # headers['Authorization'] = WebMock::Util::Headers.basic_auth_header(headers.delete('authorization')) 
     # end 

     WebMock::RequestSignature.new(
      method.downcase.to_sym, 
      uri.to_s, 
      :body => body || (@req.file && File.read(@req.file)), 
      :headers => headers 
    ) 
    end 

    end 
end