LoginSignup
8
4

More than 5 years have passed since last update.

rspecで404 NotFoundのテストが通らなかった理由

Posted at

404 NotFoundのテストが通らなかった理由

rspecのログを見ると、

レスポンスに404番を返す (FAILED - 1)
Failures:
  1) ProjectsController showアクションを検証する @projectが見つからない場合 レスポンスに404番を返す
     Failure/Error: @project = Project.find(params[:id])

     ActiveRecord::RecordNotFound:
       Couldn't find Project with 'id'=0 [WHERE "projects"."deleted_at" IS NULL]
     # ./app/controllers/projects_controller.rb:38:in `set_project'
     # ./spec/controllers/project_spec.rb:42:in `block (4 levels) in <top (required)>'
Finished in 0.03384 seconds (files took 1.06 seconds to load)
3 examples, 1 failure

となっており、

ActiveRecord::RecordNotFound

というエラーを出されている。

そのため、テストをActiveRecord::RecordNotFoundを返すように書かないといけなかった。

現在は、

expect(response.status).to eq 404

という、HTTPステータスを返すように書いてしまっていた。

そのため、下記のようにActiveRecord::RecordNotFoundを返すように修正すると、テストが通りました。

context '@projectが見つからない場合' do
  it 'レスポンスに404番を返す' do
    expect {
      get :show, params: { id: 0 }
    }.to raise_error(ActiveRecord::RecordNotFound)
  end
end
ProjectsController
  showアクションを検証する
    @projectが存在する場合
      レスポンスに200番を返す
      値をjsonで返す
    @projectが見つからない場合
      レスポンスに404番を返す

Finished in 0.04004 seconds (files took 1.23 seconds to load)
3 examples, 0 failures

showアクションで、存在しないidにアクセスする=get :show, params: { id: 0 }

エラーを出す=raise_error(ActiveRecord::RecordNotFound)

※ActiveRecordに値を渡す時は、{ }ブロックで渡すこと。

8
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
4