RSpec内で実装しているAPIリクエストのヘッダーってどうする
- チーム開発でRSpecでリクエストスペックを書いていたときに人によってRSpec内で定義しているAPIリクエストのヘッダーの書き方がまちまちだったので、ちょっと調べてみた話
- 具体的にはJSONを受け取って、JSONを返すAPIのRSpecの話
- 人によっては
Content-Type: application/json
,Accept: application/json
を両方つけたり、片方だけ、またはつけていないといったケースがあった
そもそもRSpecで定義したリクエストでヘッダーつけるか
- 細かい話ですが、下記の理由からつけたほうが良さそうかと思います
- テストコードを書くからにはテストコードからある程度仕様を読み取れたほうが良い
- クライアントがどんな形式のデータを渡すことを期待しているかは仕様としてわかったほうが良い
- 実装を読めばどんなデータを受け取っているかはわかるものかもしれないですが、ヘッダーはクライアントとやりとりするデータ形式を記載する場所なのでそれに従うならば書いておくべきかなぁと思いました
何をつけるべきか
- 今回はJSONを受け取って、JSONを返すシンプルなAPIなのでヘッダーのフィールド値は少なくとも
Content-Type
とAccept
が必要そうです - それぞれの具体的な役割を一応記載しておきます
ヘッダー名 | 送信(クライアント側で指定可能) | 受信(サーバーサイド側で指定可能) | 説明 |
---|---|---|---|
Accept | ○ | ブラウザが、画像の種類など扱えるメディアの種類の候補を送信する。サーバーはこのリストと自分が対応可能な種類を比較し、返すファイルの種類を決める | |
Content-Type | ○ | ○ | 送受信するファイル情報のMIMEタイプを指定する。 text/html, image/png など。(今回の場合は「フロントから送信するデータはJSONですよ」ということを示す情報) |
Content-Type
と Accept
どっちをつけるべきだろうか
- どちらもつけておいたほうが良さそうかなぁと思いました
- というのも今回の場合については
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