[RSpec] Stellen Sie sicher, dass die Antwort der Anforderung an die von stub_request (: post) stubisierte Google-API dem tatsächlichen Format entspricht.

Der Titel ist lang

Es wurde ein Prozess hinzugefügt, mit dem Ereignisse im Kalender aus der Rails-Anwendung mit der Google Kalender-API aktualisiert, bestimmte Attribute aus der Antwort extrahiert und verarbeitet werden können. Da der in der Antwort empfangene JSON von google-api-ruby-client in ein Objekt der Klasse Google :: API :: V3 :: Event konvertiert wird, wird die Antwort der Stub-Anforderung auch von ruby-client konvertiert oder eine ähnliche Struktur verwendet. Ich musste es zu einem Objekt machen, das ich hatte.

TL;DR

Unterschied zwischen stubisierter Anforderung und Antwort beim tatsächlichen Anfordern der API

Der folgende Code fordert die Verwendung von google-api-ruby-client an und versucht, die Ereignis-ID aus der Antwort abzurufen

Anfrage

service = Google::Apis::CalendarV3::CalendarService.new
service.authorization = access_token

response = service.update_event('primary', event_id, body)
event_id = response.id

Zu diesem Zeitpunkt lautet die Antwort wie folgt.

#<Google::Apis::CalendarV3::Event:0x000055c94da58f18
 @attachments=[],
 @attendees=[#<Google::Apis::CalendarV3::EventAttendee:xxxxxxxxxxxxxxxxxxx @email="[email protected]", @organizer=true, @self=true>],
 @created=Mon, 01 Jan 2020 00:00:00 +0000,
 @creator=#<Google::Apis::CalendarV3::Event::Creator:xxxxxxxxxxxxxxxxxxx @email="[email protected]", @self=true>,
 @description="",
 @end=#<Google::Apis::CalendarV3::EventDateTime:xxxxxxxxxxxxxxxxxxx>,
 @etag="xxxxxxxxxxxxxxxxxxx",
 @id="abcdefghijklmnopqrstu",
 @organizer=#<Google::Apis::CalendarV3::Event::Organizer:xxxxxxxxxxxxxxxxxxx @email="[email protected]">,
 @start=#<Google::Apis::CalendarV3::EventDateTime:xxxxxxxxxxxxxxxxxxx>,
 @updated=Mon, 01 Jan 2020 00:00:00 +0000>

Daher können Sie den Wert vom response-Objekt mit der getter-Methode id abrufen.

Andererseits wird in den meisten Fällen die API-Antwort in RSpec wie folgt definiert.

let(:response) do
  {
    id: 'abcdefghijklmnopqrstu',
    start: { date_time: Time.zone.today },
    end: { date_time: Time.zone.today },
    html_link: 'https://www.google.com/calendar/event?eid=xxxxxxxxxxxxxxxxxxxxxxxxxxxx',
    i_cal_uid: '[email protected]',
    summary: 'event name',
    updated: Time.zone.today,

    ...

  }.to_json
end

In diesem Fall ist es zum Abrufen der Ereignis-ID erforderlich, etwas wie "JSON.parse (response) [" id "]" auszuführen, und "response.id" wird zu NoMethodError.

Gegenmaßnahme

Um diese Antwort im JSON-Format als Ereignisklassenobjekt zurückzugeben, muss dem Antwortheader wie unten gezeigt "X-Goog-Upload-Status": "final" hinzugefügt werden.

stub_request(
  :put, url
).to_return(
  status: 201,
  body: response,
  headers: {
    content_type: 'application/json',
    'X-Goog-Upload-Status': 'final'
  }
)

[Ähnliche Header-Informationen werden zur Antwort hinzugefügt] in den Testspezifikationen von google-api-ruby-client (https://github.com/googleapis/google-api-ruby-client/blob/29f9544b1497358888cd93175e5579cab83fd247/spec/) google / apis / core / upload_spec.rb # L154).

Es kam vor, dass mein Kollege sofort einen Artikel und ein Problem auf GitHub fand, also habe ich es gelöst, aber wenn nicht, war ich 3 Tage lang süchtig danach.

Frühere Geschichte

Recommended Posts

[RSpec] Stellen Sie sicher, dass die Antwort der Anforderung an die von stub_request (: post) stubisierte Google-API dem tatsächlichen Format entspricht.
Das Format der von der Slack-API erhaltenen Nachricht ist auf subtile Weise schwierig zu verwenden
Spielen Sie Musik, indem Sie auf die inoffizielle API von Google Play Music klicken
Python-Anfänger nutzen die inoffizielle API von Google Play Music, um Musik abzuspielen
Versuchen Sie, so viel wie möglich mit dem Beispielprogramm des Schnellstarts der Google Spreadsheet API (v4) zu kratzen