2016-06-02 19 views
0

Ich versuche, die Methode „get_all_hotels“ auf meinem HotelsApiService Modul zu testen:nicht in der Lage zu Mock httparty Anfrage auf Servicemodul Test

BASE_URI = ENV['HOTELS_API_URI'] 

def get_all_hotels 
    begin 
     RequestService.new(BASE_URI).get("/hotels") 
    rescue 
     "Unable to get service response" 
    end 
end 

Aber nicht die Tests diesen Punkt Pass. Scheinbar ist das Problem, wenn ich den Aufruf von RequestService nachahmen möchte (RequestService ist eine Klasse, die HTTParty verwendet, um HTTP-Anfragen auszuführen).

Dies ist die Testdatei:

require "rails_helper" 

describe HotelsApiService do 
    let(:base_uri) { "base_uri" } 
    let(:request_service) { double } 

    subject { Object.new.extend HotelsApiService } 

    before do 
    allow(ENV).to receive(:[]).with('HOTELS_API_URI') { base_uri }   
    end 

    describe "#get_all_hotels" do 
    let(:api_response) { 
     { hotel: { id: 1, name: "Hotel name", address: "Str 34", star_rating: 3, accomodation_type: "hotel" }} 
} 

    before do 
     allow(RequestService).to receive(:new).with(base_uri) { request_service } 
     allow(request_service).to receive(:get).with("/hotels") { api_response } 
    end 

    it 'responds with hotel' do 
     expect(subject.get_all_hotels).to eq(api_response.to_json) 
    end 

    end 
end 

dieses Wie der Test gibt folgende Fehler:

Failure/Error: expect(subject.get_all_hotels).to be_a_kind_of(Hotel) 
    #<RequestService (class)> received :new with unexpected arguments 
    expected: ("base_uri") 
      got: (nil) 
    Diff: 
    @@ -1,2 +1,2 @@ 
    -["base_uri"] 
    +[nil] 

    Please stub a default value first if message might be received with other args as well. 

Und wenn ich versuche, es auf diese andere Art und Weise zu verspotten:

before do 
    allow(RequestService).to receive_message_chain(:new, :edit).with(base_uri, "/hotels") { request_service } 
end 

Ich bekomme diesen anderen Fehler:

Failure/Error: expect(subject.get_all_hotels).to eq(api_response.to_json) 
    #<Double (anonymous)> received unexpected message :get with ("/hotels") 

Vielen Dank im Voraus

Antwort

0

BASE_URI gesetzt wird, wenn die Quelldatei geladen wird, die, bevor Sie ENV haben verspottet ist der Wert, den Sie erwarten, zurückzukehren. Daher entspricht es Null und verursacht Ihr Problem.

+0

Dank @ Tom Walpole, ich verstehe Ihren Standpunkt. Aber wo sollte ich es dann verspotten? – ntonnelier

+0

@ntonnelier Die Art, wie es geschrieben wurde, kann man nicht verspotten - Um es zu verspotten, müsste man es zur Laufzeit auswerten, etwa wie 'RequestService.new (ENV [' HOTELS_API_URI ']). Get ("/ hotels") 'oder wenn Sie nicht jedes Mal auf ENV zugreifen möchten, können Sie die ENV-Suche in eine Klassenmethode verschieben, so dass sie nur bei der ersten Verwendung ausgewertet wird - was Sie dann in Ihren Tests immer dann herausnehmen könnten, wenn Sie ihren Wert ändern wollten. –