RspecでJSONのAPIテストするときはheader情報をつけよう!

RspecでAPIテストするときの注意点です。

integerで送っているつもりがstringになっていた!

RailsでAPIサーバーを作成しているのですが、JSONのリクエストにはDHCというChrome拡張アプリを使ってます。

chrome.google.com

JSONのPOSTリクエストするときはHeader情報をつけています。これはPOSTリクエストでJSONを選ぶとJSON用?のheaderが自動的についてくれます。

rice%20curry%20-%20DHC%20by%20Restlet

自動的についていたので、Rspecでテストするときにheader情報をつけていなかったら、テストが通りませんでした。
logを見てみるとintegerで送っていたつもりの値がstringに変換されていました。
ちなみにlogを見るときはターミナルでtail -f log/development.logとかtail -f log/test.logみたいな感じで叩くとターミナルで随時更新されたlogを見れます。

スマホからAPIを叩くときはheader情報をつけるらしい

どうやらスマホからAPIを叩くときは、header情報をつけてくれるらしいです。つまり、Rspecのテストの際も、DHCで動作確認するときもheader情報をつけましょう!

Rspecのドキュメントにも書いてあった!

Rspecのドキュメントにも書いてありました。header情報をつけるのを忘れないようにしましょう!

www.relishapp.com

require "rails_helper"
RSpec.describe "Widget management", :type => :request do
it "creates a Widget" do
headers = {
"ACCEPT" => "application/json",     # This is what Rails4
accepts
"HTTP_ACCEPT" => "application/json" # This is what Rails 3 accepts
}
post "/widgets", { :widget => {:name => "My Widget"} }, 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", '{ "widget": { "name":"My Widget" } }', headers
expect(response).to redirect_to(assigns(:widget))
end
end

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です