LoginSignup
1
0

More than 3 years have passed since last update.

E2Eテストをchromedriverでやる場合の、FactoryBotの初期データ作成

Last updated at Posted at 2019-07-25

はじめに

turnipを使った、E2Eテストを実装したくテストデータの作成に、FactoryBotを使用。turnipのテスト開始時に、初期データを作成するものの、turnipのstepの中からは作成した初期データにアクセスできるが、E2Eテストで使っている、chromedriverの画面(controllerでも)からは、テストデータにアクセスができない。

環境

  • macOS Mojave 10.14.5
  • ruby 2.4.0
  • Rails 5.0.4

結論

spec/rails_helper.rb
RSpec.configure do |config|
  # ...

  config.use_transactional_fixtures = true

  # ...
end

'config.use_transactional_fixtures'の部分が'true'になっていると、データは永続化されないので、stepの中からはアクセスできても、chromedriverが参照しているDBは相変わらず空のまま。

この部分を、'config.use_transactional_fixtures = false'にしたら、testデータベースにデータが保存されるようになりました。

動作の変化をログで比較

変更前

log/test.log
(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

変更後

log/test.log
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で行いたい場合。

spec/steps/articles_steps.rb
# 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を導入しました。

1
0
0

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
1
0