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