12
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

CapybaraのJavaScriptテスト自動化時Seedを使う方法

Last updated at Posted at 2013-03-14

背景: 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

こんな感じ。

12
12
2

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
12
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?