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
Dank @ Tom Walpole, ich verstehe Ihren Standpunkt. Aber wo sollte ich es dann verspotten? – ntonnelier
@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. –