WebMock ist eine bekannte Scheinbibliothek, die es schon lange gibt, aber ich werde zusammenfassen, was ich auf verschiedene Weise versucht habe, als ich versuchte, eine kleine detaillierte Überprüfung mit RSpec als mein eigenes Memo durchzuführen. Wir beschäftigen uns hauptsächlich mit Überprüfungsmethoden für HTTP-Anforderungen, wobei Anforderungen an externe APIs angenommen werden.
Ruby : 2.7.1 RSpec : 3.9.0 webmock : 3.8.3
Dieses Mal werde ich als Beispiel https://jsonplaceholder.typicode.com/ anfordern.
sample.ruby
require 'net/http'
class Sample
def request(params = {})
URI.parse('https://jsonplaceholder.typicode.com/todos')
.tap { |uri| uri.query = URI.encode_www_form(params) }
.then { |uri| Net::HTTP.get_response(uri) }
.then { |res| res.body if res.is_a?(Net::HTTPSuccess) }
end
end
Verwenden Sie "stub_request" von webmock, um eine Anfrage an die angegebene URL zu einem Mock zu machen. Zusätzlich wird die Überprüfung zum Zeitpunkt von "erwarten" durch das Muster unter Verwendung von "a_request" durchgeführt.
sample_spec.rb
context 'Grundform' do
before do
stub_request(:get, 'https://jsonplaceholder.typicode.com/todos').and_return(status: 200, body: 'hoge')
end
it 'Richtig angefordert werden' do
expect(Sample.new.request).to eq 'hoge'
expect(a_request(:get, 'https://jsonplaceholder.typicode.com/todos')).to have_been_made.once
end
end
context 'Grundformular 2 Überprüfen Sie die Abfragezeichenfolge' do
before do
stub_request(:get, 'https://jsonplaceholder.typicode.com/todos?userId=2').and_return(status: 200, body: 'hoge')
end
it 'Richtig angefordert werden' do
expect(Sample.new.request(userId: 2)).to eq 'hoge'
expect(
a_request(:get, 'https://jsonplaceholder.typicode.com/todos').with(query: { userId: 2 })
).to have_been_made.once
end
end
--have_bee_made
ist ein Matcher für RSpec, der von WebMock bereitgestellt wird. Es sind mehrere andere Matcher verfügbar.
einmal
ist auch ein von WebMock erstellter Matcher, und auch hier gibt es verschiedene Variationen.with
auch mit dem Wert body`` headers`` basic_auth
validiert werden.Beispielsweise möchten Sie möglicherweise die von Ihnen angeforderte URL von "todos" in "todos / 1" ändern, oder Sie möchten testen, indem Sie weitere Abfragezeichenfolgen angeben. In diesem Fall möchten Sie jedoch möglicherweise jeder Anforderung entsprechen. Wenn Sie die URL-Zeichenfolge von "stub_request" nicht ändern, wird sie nicht verspottet. Das ist ein Ärger, also werden wir uns mit regulären Ausdrücken darum kümmern.
stub_request(:get, /https:\/\/jsonplaceholder.typicode.com/).and_return(status: 200, body: 'hoge')
Auf diese Weise werden alle Anfragen unter der Domain "https: // jsonplaceholder.typicode.com /" verspottet und können mit "a_request" überprüft werden.
Reguläre Ausdrücke können auch in "a_request" verwendet werden.
expect(a_request(:get, /https:\/\/jsonplaceholder.typicode.com/)).to have_been_made
Sie können die Abfragezeichenfolge jedoch nicht mit "with" in "a_request" überprüfen, wie unten gezeigt.
#Diese Schreibweise ist NG
expect(a_request(:get, /https:\/\/jsonplaceholder.typicode.com/).with(query: { userId: 2)).to have_been_made
In diesem Abschnitt wird beschrieben, wie Sie eine Abfragezeichenfolge überprüfen, die mehrere identische Schlüssel angibt (siehe unten).
Für Rails-Anwendungen wird standardmäßig "[]" hinzugefügt, wie unten gezeigt. ([]
ist so codiert, dass es genau % 5B% 5D
ist)
?userId[]=1&userId[]=2&userId[]=3
Sie können ein Array in with
mit dem Hash von query
angeben, wie unten gezeigt. Sie können wie Schienen schreiben.
expect(
a_request(:get, 'https://jsonplaceholder.typicode.com/todos').with(query: { userID: [1, 2, 3] })
).to have_been_made
Für Nicht-Rails-Anwendungen wie externe APIs enthalten die meisten Muster nicht "[]", wie unten gezeigt.
?userId=1&userId=2&userId=3
Setzen Sie in diesem Fall das Symbol : flat_array
in WebMock wie unten gezeigt.
WebMock::Config.instance.query_values_notation = :flat_array
Die Überprüfungsmethode besteht darin, den Wert als Zeichenfolge mit dem "Abfrage" -Hash von "mit" anzugeben, wie unten gezeigt.
expect(
a_request(:get, 'https://jsonplaceholder.typicode.com/todos').with(query: 'userID=1&userID=2&userID=3')
).to have_been_made
Wenn Sie Zeichenfolgen nicht direkt schreiben möchten, können Sie sie mit URI.encode_www_form in Zeichenfolgen konvertieren.
expect(
a_request(:get, 'https://jsonplaceholder.typicode.com/todos').with(query: URI.encode_www_form(userId: [1, 2, 3]))
).to have_been_made
flat_array
gesetzt ist, wird die Abfragezeichenfolge nach with
sortiertWenn Sie "WebMock :: Config.instance.query_values_notation =: flat_array" festlegen, die Abfragezeichenfolge jedoch mit with validieren, müssen Sie den Wert übergeben, der nach Zeichenreihenfolge der Schlüssel sortiert ist.
Wenn Sie im zu testenden Code im Titel Folgendes ausführen, wird die Abfragezeichenfolge als "Benutzer-ID = 1 & aa = 1" angefordert, aber die neu angeordnete Zeichenfolge "aa = 1 & Benutzer-ID = 1" wird an "Abfrage" von "mit" übergeben. Ohne war es nutzlos.
WebMock::Config.instance.query_values_notation = :flat_array
Sample.new.request(userId: 1, aa: 1)
# OK
expect(
a_request(:get, 'https://jsonplaceholder.typicode.com/todos').with(query: 'aa=1&userId=1')
).to have_been_made
#Hash ist in Ordnung
expect(
a_request(:get, 'https://jsonplaceholder.typicode.com/todos').with(query: { userId: 1, aa: 1 })
).to have_been_made
#Das ist NG
expect(
a_request(:get, 'https://jsonplaceholder.typicode.com/todos').with(query: 'userId=1&aa=1')
).to have_been_made
https://github.com/bblimke/webmock
Recommended Posts