地方でリモートワーク

プログラミング、先物、fx,仮想通貨なんでもやります

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