RSpecでテストデータが大きくてコードが見ずらい対策にfixtureを使う
RSpecでテストを書いていて、データベース以外のテストデータは基本的にはテストコードの中に書いていると思う。
ただ、そのテストデータが配列やハッシュなんかで結構量が多くなるとテストコードが読みにくくなってしまう。
特にテストケースが分岐多くて、テストデータがもおおきいとしんどい。
そこで、テストデータをなんとかテストコードの外に切り出してみたいと思ったんだけど、file_fixture
を使って切り出したテストデータを読み込むようにするとよさそう。
たとえば、こんな配列形式のテストデータがあったとする。これをletなんかで定義すると一気にテストが読みにくくなる。
こんな感じで時刻のデータがずらっと続くようなバヤイ。
[
['00:00', '2018/06/11 00:00:00'],
['00:15', '2018/06/11 00:15:00'],
['00:30', '2018/06/11 00:30:00'],
['00:45', '2018/06/11 00:45:00'],
['01:00', '2018/06/11 01:00:00'],
['01:15', '2018/06/11 01:15:00'],
['01:30', '2018/06/11 01:30:00'],
['01:45', '2018/06/11 01:45:00'],
['02:00', '2018/06/11 02:00:00'],
['02:15', '2018/06/11 02:15:00'],
['02:30', '2018/06/11 02:30:00'],
['02:45', '2018/06/11 02:45:00'],
['03:00', '2018/06/11 03:00:00'],
# 〜 略
]
まずはこのテストデータをspec/fixtures/files/test_data.txt
として保管しておく。
files
配下にディクレクトリを作ってもOK。その方が管理がしやすくなりそうだ。
(実際のプロジェクトでは、自分はspec配下のディレクトリ構造を模して作ってみた)
あとは、以下のようにletのところででファイルを読み込めばOK。
spec/fixtures/files
から下のパスをfile_fixture
に指定する。
そのままだと文字列になっちゃうので、配列として展開したかったからeval
も使っている。
ハッシュだったら、JSON.parse
でもいいね。
let(:expected_array) { eval(file_fixture('test_data.txt').read) }
これで大分テストコードが見やすくなった。
テストデータ以外にも、APIのモックが返すレスポンスとかにも使えそうだ。
この記事の環境情報
- RSpec 3.11.0
RSpecに関する他の記事を読む
最近の記事を読む
- Flutterでcontextを使わずにlocale情報を取得する
- Cloud RunでIAPを有効にしようとしてハマったこと
- slimでtype='application/ld+json'のscriptタグを書く
- タグマネージャーでjsのloadイベントを発火させたいとき
- mysqlコマンドを実行してERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)と言われたら