動かざることバグの如し

近づきたいよ 君の理想に

RspecでRaw post dataなPOSTを実行する

環境

経緯

そもそもRaw post dataとはなんぞや、から。

RailsでRequest Specを書く場合、当然POSTメソッドのテストも書くケースがある。

そんなときはこんな感じになると思う。

# spec/requests/logins_spec.rb
require "rails_helper"

RSpec.describe "Sessions", type: :request do
  describe "POST /login" do

    context "xxxなとき" do

      before do
        post login_path, params: { email: "aaa@example.com" }
      end

      it "xxxすること" do
        # 略
      end
    end
  end
end

重要なのは post login_path, params: { email: "aaa@example.com" } で、これでPOST送信できる。

このときのPOST送信をcurlに書き換えてみると

curl -X POST -F 'email=aaa@example.com’ http://example.com/login

となり、よくある<form>のHTMLフォームからsubmitした挙動と同じパラメータで渡すことができる。

このときのContent-Typeはmultipart/form-dataになる。

が、歴史的経緯によりraw post dataなPOSTで受け取る場合、上のテストが使えない。

具体的にcurlで表すと

curl -X POST -d 'email=aaa@example.com' http://example.com/login

の場合。

やり方

params引数に文字列を渡すと暗黙的にRaw post dataなPOSTになる

post '/path', params: '{"foo": "bar", "bool": true}', headers: { 'Content-Type' => 'application/json' }

これで Controller側では request.body.read で中身が受け取れると思う。

使うケースは少ないかもだが、、

参考リンク