[RUBY] [RSpec] WebMock verarbeitet reguläre Ausdrücke und Array-Abfragezeichenfolgen

Einführung

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.

Umgebung

Ruby : 2.7.1 RSpec : 3.9.0 webmock : 3.8.3

Zu testender Code

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

Grundform

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.

Ich möchte ein Wildcard-ähnliches Ding mit einem regulären Ausdruck verwenden

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

So überprüfen Sie Array-Abfragezeichenfolgen

In diesem Abschnitt wird beschrieben, wie Sie eine Abfragezeichenfolge überprüfen, die mehrere identische Schlüssel angibt (siehe unten).

Schienen Standard

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

Schienen Wenn nicht Standard

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

Wenn flat_array gesetzt ist, wird die Abfragezeichenfolge nach with sortiert

Wenn 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

Referenz

https://github.com/bblimke/webmock

Recommended Posts

[RSpec] WebMock verarbeitet reguläre Ausdrücke und Array-Abfragezeichenfolgen
[Java] Vergleichsmethode für Zeichenketten und Vergleichsmethode mit regulären Ausdrücken
Reguläre Ausdrücke
Wechseln Sie die Beans mit den kanonischen Ausdrücken @ConditionalOnExpression und SpEL
Unterscheiden Sie mit regulären Ausdrücken zwischen ganzen Zahlen und Brüchen