はじめに
turnipを使った、E2Eテストを実装したくテストデータの作成に、FactoryBotを使用。turnipのテスト開始時に、初期データを作成するものの、turnipのstepの中からは作成した初期データにアクセスできるが、E2Eテストで使っている、chromedriverの画面(controllerでも)からは、テストデータにアクセスができない。
環境
- macOS Mojave 10.14.5
- ruby 2.4.0
- Rails 5.0.4
結論
RSpec.configure do |config|
# ...
config.use_transactional_fixtures = true
# ...
end
'config.use_transactional_fixtures'の部分が'true'になっていると、データは永続化されないので、stepの中からはアクセスできても、chromedriverが参照しているDBは相変わらず空のまま。
この部分を、'config.use_transactional_fixtures = false'にしたら、testデータベースにデータが保存されるようになりました。
動作の変化をログで比較
変更前
(0.2ms) BEGIN
(0.2ms) SAVEPOINT active_record_1
SQL (0.4ms) INSERT INTO `articles` (`title`, `body`, `created_at`, `updated_at`) VALUES ('TEST_TITLE1', 'TEST_BODY1', '2019-07-25 09:30:17', '2019-07-25 09:30:17')
(0.1ms) RELEASE SAVEPOINT active_record_1
変更後
BEGIN
SQL (0.2ms) INSERT INTO `articles` (`title`, `body`, `created_at`, `updated_at`) VALUES ('TEST_TITLE6', 'TEST_BODY6', '2019-07-25 09:18:31', '2019-07-25 09:18:31')
(0.4ms) COMMIT
ログから、'RELEASE SAVEPOINT active_record_1'というのが消えて、通常通りのインサート文になりました。
どのような状況で必要になったか
例えば以下のようなテストをturnipで行いたい場合。
# conding: utf-8
step 'サイトにアクセスする' do
Capybara.app_host = 'http://localhost:3000'
end
step 'articlesの初期データを作成する' do
create_list(:article, 10) # ①テストデータの作成
end
step 'アーティクル一覧画面を表示する' do
visit 'http://localhost:3000/articles'
end
step '記事が10件表示されていること' do
puts Article.all.count # 10と表示されちゃんと①のデータが作成されている。
# しかしchromedriverからは、10件のデータにアクセスできない。
expect(page).to have_content '10件'
end
課題
テストが終わったあとに、testデータベースにデータが残るので、最後にクリーンアップする方法を検討する。
追記
こちらの記事で、database_cleanerを導入しました。