1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

RSpec内で実装しているAPIリクエストのヘッダーどうする

Last updated at Posted at 2021-08-15

RSpec内で実装しているAPIリクエストのヘッダーってどうする

  • チーム開発でRSpecでリクエストスペックを書いていたときに人によってRSpec内で定義しているAPIリクエストのヘッダーの書き方がまちまちだったので、ちょっと調べてみた話
  • 具体的にはJSONを受け取って、JSONを返すAPIのRSpecの話
  • 人によっては Content-Type: application/json, Accept: application/json を両方つけたり、片方だけ、またはつけていないといったケースがあった

そもそもRSpecで定義したリクエストでヘッダーつけるか

  • 細かい話ですが、下記の理由からつけたほうが良さそうかと思います
  • テストコードを書くからにはテストコードからある程度仕様を読み取れたほうが良い
    • クライアントがどんな形式のデータを渡すことを期待しているかは仕様としてわかったほうが良い
    • 実装を読めばどんなデータを受け取っているかはわかるものかもしれないですが、ヘッダーはクライアントとやりとりするデータ形式を記載する場所なのでそれに従うならば書いておくべきかなぁと思いました

何をつけるべきか

  • 今回はJSONを受け取って、JSONを返すシンプルなAPIなのでヘッダーのフィールド値は少なくとも Content-TypeAccept が必要そうです
  • それぞれの具体的な役割を一応記載しておきます
ヘッダー名 送信(クライアント側で指定可能) 受信(サーバーサイド側で指定可能) 説明
Accept ブラウザが、画像の種類など扱えるメディアの種類の候補を送信する。サーバーはこのリストと自分が対応可能な種類を比較し、返すファイルの種類を決める
Content-Type 送受信するファイル情報のMIMEタイプを指定する。 text/html, image/png など。(今回の場合は「フロントから送信するデータはJSONですよ」ということを示す情報)

Content-TypeAccept どっちをつけるべきだろうか :thinking:

  • どちらもつけておいたほうが良さそうかなぁと思いました
  • というのも今回の場合については JSONを受け取って、JSONを返すAPIをテストしているのでクライアントから受け取るデータ、サーバーから返すデータについてデータ形式を正しく指定したほうがテストとしては再現性高そうと思ったからです

おまけ)RSpecでの指定のheader指定の仕方

require "rails_helper"

RSpec.describe "Widget management", :type => :request do

  it "creates a Widget" do
    headers = { "ACCEPT" => "application/json" }
    post "/widgets", :params => { :widget => {:name => "My Widget"} }, :headers => headers

    expect(response.content_type).to eq("application/json")
    expect(response).to have_http_status(:created)
  end

end
require "rails_helper"

RSpec.describe "Widget management", :type => :request do

  it "creates a Widget and redirects to the Widget's page" do
    headers = { "CONTENT_TYPE" => "application/json" }
    post "/widgets", :params => '{ "widget": { "name":"My Widget" } }', :headers => headers
    expect(response).to redirect_to(assigns(:widget))
  end

end
1
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?