show アクションのテストでハマった話

テストでエラー発生

ActiveRecord::RecordNotFound: Couldn't find Book with 'id' = 1

f:id:matt-note:20181031205700p:plain

 

rails c で確認してみる。うーん、データベースには id: 1 のレコードが入っているのだが…。

f:id:matt-note:20181031205750p:plain

 

エラーとなったコードは以下の通り。show アクションに { id: 1 } のパラメータを渡して、正常にレスポンスを返すことをテストしたい。データベースにデータが入っているのに、なぜテストがエラーになるのか…?

f:id:matt-note:20181031205839p:plain

 

テストはテスト用のデータベースを使う

見出しの通り、テストはテスト用のデータベースを使うことになる。つまり、開発用データベースのレコードは、テストでは関係がない。ここでは、テスト用のデータベースにレコードを追加する必要があるというわけだった。

f:id:matt-note:20181031215002p:plain

 

 factory を作成

f:id:matt-note:20181031210520p:plain

 

テスト用レコードをデータベースに保存

以下の、FactoryBot.create メソッドでテスト用データベースにレコードを作成する。このメソッドを呼び出さずにテストをすると、ActiveRecord::RecordNotFound となる。

f:id:matt-note:20181031211028p:plain

 

テストしてみる

無事、テストが通った。

f:id:matt-note:20181031211052p:plain

 

まとめ

テストでは、テスト用データベースを使用する。テストの時は、開発用データベースのレコードは関係ない。FactoryBot.create メソッドは、テスト用データベースにレコードを作成する。