注意
- 別にpoltergeistを使った場合に限った話ではない
- 別にログインのテストに限った話ではない
概要
- Capybara、turnipを使ってdeviseのログインテストを書いた
- なぜかconfig.default_driverを:poltergeistに変えたら通らなくなった
- テストユーザのデータは、FactoryGirlでテストごとに作成していた
原因と解決策
- http://o.inchiki.jp/obbr/253#toc_7
- http://ruby-rails.hatenadiary.com/entry/20150101/1420093487#rspec-prepare-capybara-webkit
- http://stackoverflow.com/questions/22304371/why-do-rspec-feature-specs-using-capybara-poltergeist-and-javascript-fail-incon
- http://devblog.avdi.org/2012/08/31/configuring-database_cleaner-with-rails-rspec-capybara-and-selenium/
以下のような理解
- rspecのプロセスとテスト用ブラウザプロセスは別
- poltergeistを使わずcapybaraでテストしていたときは、実際のブラウザプロセスが動いていなかった(たぶん)からテストが通っていた
- rspecプロセス側のトランザクション内で作成したテストデータが、ブラウザプロセス側には反映されていなかった(トランザクションなので)
- rspecが管理するトランザクションをやめて、テストごとにテストデータ作成+削除をする必要がある
以下、実際の解決方法
database_cleanerというgemを導入
rspec側のfixturesのトランザクションを無効化
RSpec.configure do |config|
...
config.use_transactional_fixtures = false
end
- テストデータの削除タイミングを設定(jsを使う場合のみtruncationにするなど、この通りでなくてもいい)
RSpec.configure do |config|
config.before(:suite) do
DatabaseCleaner.strategy = :truncation
end
config.before(:each) do
DatabaseCleaner.start
end
config.after(:each) do
DatabaseCleaner.clean
end
end
まとめ
- いまさら感あるっぽいけど、rails初心者は確実にハマる
- そもそも、テストデータが毎回勝手に消えてるな−、程度にしか考えてなかった
- よく思い返せば、ログには「ROLLBACK」とかいう文字が出てました
- そもそも、テストデータが毎回勝手に消えてるな−、程度にしか考えてなかった
- rails奥が深い