背景: DatabaseCleanerでtruncateするので、seedが消えてしまう
Rspec Capybara_webkitを使ってjavascriptをテストする - Kinopyo Blog の記事に書かれていらっしゃるように、CapybaraのJavaScriptテスト実行時は、
- transactional_fixturesをOFF
- DatabaseCleanerを使う
- DatabaseCleanerのstrategyにはtruncationを指定する
というやり方が一般的。
truncationを使うということは、table中のデータが全部きえるので、seedが消えてしまう、ということ。
truncationを使うけど、seedを使う方法について以下にまとめ。
Seedを使いたいケース 1
たとえば、都道府県マスタテーブルのようなほぼ、静的なテーブルを使っているようなケースなど、test environmentでもseedを使いたいケースがあると思う。
この場合、truncateの対象から外す事で、seedを消させないことができる。
Cucumber::Rails::Database.javascript_strategy = :truncation, {:except => %w[prefectures]}
Seedを使いたいケース 2
usersテーブルのID=1は「admin」というスーパー管理者である、といったケースもある。
この場合、テスト時は、usersテーブルの、ID=1以外のレコードは消したい。
producationコードのセットアップ上、ID=1のデータはseedを使って登録したい。
このようなケースでは、自分の場合、truncateしたあとに、Seedで個別のテーブルだけ挿入する、というやりかたで対応した。
なお、seeds.rbの場合特定のテーブルだけのSeedを登録する、といったことには対応できない(と、思う)
そこで、seed-fu を使う。
seed-fuはテーブル単位でseedを管理でき、すでにレコードが存在しているなら挿入しない、などができて便利。
Cucumberから使ってるとして、usersテーブルにID=1のレコードが存在してほしいケースだけ、stepからseedを使ってレコードを挿入するようなやり方をした。
前提 /^管理画面トップページを表示している/ do
SeedFu.quiet = true
SeedFu.seed(File.join([Rails.root, 'db', 'fixtures']), /(?-mix:users)/)
visit admin_root_path
end
こんな感じ。