[RSpec] Faites en sorte que la réponse de la requête à l'API Google stubisée par stub_request (: post) soit au même format que la vraie.

Le titre est long

Ajout d'un processus pour mettre à jour les événements du calendrier à partir de l'application Rails avec l'API Google Calendar, extraire des attributs spécifiques de la réponse et les gérer. Étant donné que le JSON reçu dans la réponse est converti par google-api-ruby-client en un objet de la classe Google :: API :: V3 :: Event, la réponse de la requête de stub est également convertie par ruby-client ou une structure similaire est utilisée. Je devais en faire un objet que j'avais.

TL;DR

Différence entre la demande stubisée et la réponse lors de la demande réelle d'API

Le code ci-dessous demande à l'aide de google-api-ruby-client et tente d'obtenir l'ID d'événement à partir de la réponse

demande

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

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

A ce moment, la "réponse" est la suivante.

#<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>

Par conséquent, la valeur peut être obtenue à partir de l'objet response avec la méthode getter ʻid`.

En revanche, dans la plupart des cas, la réponse API sera définie dans RSpec comme suit.

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

Dans ce cas, pour obtenir l'ID d'événement, il est nécessaire de faire quelque chose comme JSON.parse (response) ['id'], et response.id devient NoMethodError.

contre-mesure

Afin de renvoyer cette réponse au format JSON en tant qu'objet de classe Event, il est nécessaire d'ajouter `` X-Goog-Upload-Status ':' final '' à l'en-tête de la réponse comme indiqué ci-dessous.

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

[Des informations d'en-tête similaires sont ajoutées à la réponse] dans les spécifications de test de google-api-ruby-client (https://github.com/googleapis/google-api-ruby-client/blob/29f9544b1497358888cd93175e5579cab83fd247/spec/ google / apis / core / upload_spec.rb # L154).

Il est arrivé que mon collègue ait immédiatement trouvé un article et un problème sur GitHub, alors je l'ai résolu, mais sinon, je pense que j'en ai été accro pendant 3 jours.

Ancienne histoire

Recommended Posts

[RSpec] Faites en sorte que la réponse de la requête à l'API Google stubisée par stub_request (: post) soit au même format que la vraie.
Le format du message obtenu par Slack API est subtilement difficile à utiliser
Écoutez de la musique en accédant à l'API non officielle de Google Play Music
Les débutants en Python utilisent l'API non officielle de Google Play Music pour jouer de la musique
Essayez de gratter autant que vous le pouvez le programme d'exemple de démarrage rapide de l'API Google Spreadsheet (v4)