問題
Ruby on Rails の Rspec で JSON を受け取る API をテストするとき、渡すパラメータの値に異常値も入れてテストしておきたいなぁと思います。よくある異常値として null がありますね。
でも、これをテストするのはちょっと難しいです。
なぜなら、チュートリアルでよくあるようにパラメータをハッシュにして API のエンドポイントに渡そうとすると、 null はハッシュの値として認めてもらえず、 ArgumentError になってしまいます。
ハッシュを to_json
メソッドでJSONに変えようとしても同じことです。
ではどうしたら null をパラメータに含めてテストすることができるのか、考えました。
解決方法
JSON を文字列として作り、その JSON に null を含めたものを API のパラメータにすればOKです。
コードは以下になります。
require "rails_helper"
RSpec.describe "エンドポイントにnullを渡す", :type => :request do
it "エラーが返ってくる" do
headers = { "CONTENT_TYPE" => "application/json" }
post "/path/to/endpoint", :params => '{ "hoge": null} }', :headers => headers
expect(response.status).to eq 422
end
end
このコードは次のページのものの改変になります。
https://relishapp.com/rspec/rspec-rails/v/5-0/docs/request-specs/request-spec#providing-json-data
"CONTENT_TYPE" => "application/json"
を指定してやるのがキモです。
まとめ
分かっていれば何のつまづきもないところだと思いますが、私はつまづいたので備忘録がわりに残しておきます。