RSpecでJSONによるPOSTリクエストをテスト

スポンサーリンク

Rails プロジェクトで、生の JSON データをコントローラーのメソッドに POST する RSpec のテストを書きたかったのですが、書き方でとても苦労したので備忘録メモ。

— 環境 —
rails 4.1
rspec-rails 3.1.0

【お知らせ】 英単語を画像イメージで楽に暗記できる辞書サイトを作りました。英語学習中の方は、ぜひご利用ください!
画像付き英語辞書 Imagict | 英単語をイメージで暗記
【開発記録】
英単語を画像イメージで暗記できる英語辞書サービスを作って公開しました
スポンサーリンク

JSON データの POST が Controller Spec で動かない…

最初、テストの性質からしてコントローラーのテスト(spec/controllers/some_controller_spec.rb)に、JSON データを POST するテストを書こうとしました。結果、色んな書き方を試したのですが、どうにも動作しない…。JSON データじゃなくて、パラメータのハッシュを POST する場合は、以下のページの書き方で普通に動きます。

RSpec の ControllerSpec でパラメータとともに post 送信するテスト | EasyRamble

ぐぐりまくって調べたところ、次の stackoverflow ページを発見。

As far as I have been able to tell, sending raw POST data is no longer possible within a controller spec. However, it can be done pretty easily in a request spec:

結果としては、上記ページに書いてある、request spec 内で JSON データを POST する方法で上手く動作させることができました。その下に controller spec に書く方法も書いてありますけど、そっちは試してません。

Request Spec で JSON データを POST するテストコード

SomeController#some_action に、request.body として受け取った JSON データを parse して、その後に SomeModel オブジェクトをDBレコードに保存するような処理が書いてあるという前提です。

app/controllers/some_controller.rb

ルーティングは以下のとおり。

config/routes.rb

この SomeController#some_action に生の文字列の JSON データを POST して、POST が成功したら SomeModel のレコードが1つ増えるのを確認するテストコードを書きたかった。最終的に書いたのが以下のようなテストコードです。

spec/requests/some_request_spec.rb

この request spec に書く方法で無事に動作させることができ、テストが通るのを確認できました。

スポンサーリンク
私は Rails のテストフレームワークには RSpec を使っています。サーバーのテスト用に Serverspec もおすすめです。
 
スポンサーリンク

Leave Your Message!