RequestSpecのテスト項目めも
TL;DR
- ここに示すのはテストする項目だけ、詳細はこの記事がとてもわかりやすかった
- new, editアクションはFeature(System)Specと要相談な感じ
開発環境
本題
注意点
JSON APIはControllerSpecでは使えない(というよりRequestSpecで書いた方が良い)
controller specではresponse.bodyをテストすることができません。(render_viewを呼ばない限りresponse.bodyは""になる)その為JSON APIのテストはrequest specで行うのが適切です。 indexアクションの場合は以下のような感じになるはずです。
Rails5でコントローラのテストをController specからRequest specに移行する - QiitaRSpec公式 request spec - Request specs - RSpec Rails - RSpec - Relish
テストすべき内容
テストすべき内容は主に下記の項目
- Webリクエストが成功したか
- 正しいページにリダイレクトされたか
- ユーザー認証が成功したか
- レスポンスのテンプレートに正しいオブジェクトが保存されたか
- ビューに表示されたメッセージは適切か
ちなみにshow, editアクションのエラーを返す、表示されること(ActiveRecord::RecordNotFound)
はテストをしなくてもよい(らしい)
【追記】requestテストでの確認項目は、statusとbodyだけで問題ないとする人もいる?
アクションごとに項目をあげる
indexアクション(GET#index)
showアクション(GET#show)
- インスタンスが存在する場合
- インスタンスが存在しない場合
- エラーを返す、表示されること(ActiveRecord::RecordNotFound)
newアクション(GET#new)
- リクエストが成功すること
- newテンプレートで表示されること(<- ControllerSpec)
createアクション(POST#create)
- パラメーターが妥当な場合
- リクエストが成功すること
- 新規レコードが保存されること
- (妥当なページへ)リダイレクトすること
- パラメーターが不正な場合
- リクエストが成功すること
- 新規レコードが保存されないこと
- エラーを返す、表示されること(ActiveRecord::RecordNotFound)
editアクション(GET#edit)
- インスタンスが存在する場合
- インスタンスが存在しない場合
- エラーを返す(ActiveRecord::RecordNotFound)
updateアクション(POST#update)
- パラメーターが妥当な場合
- リクエストが成功すること
- 既存レコードが更新されること
- (妥当なページへ)リダイレクトすること
- パラメーターが不正な場合
- リクエストが成功すること
- 既存レコードが更新されないこと
- エラーを返す、表示されること(ActiveRecord::RecordNotFound)
destroyアクション(DELETE#destroy)
- リクエストが成功すること
- 既存レコードが削除されること
- (妥当なページへ)リダイレクトすること
以上!!