8

ログインページに Capybara の機能仕様があり、FactoryGirl + DatabaseCleaner を使用しています

require 'rails_helper'

feature 'Admin signs in' do

  background do
    FactoryGirl.create(:user)
  end

  scenario 'with valid credentials' do
    visit admin_root_path
    fill_in 'user_email', :with => 'email@email.com'
    fill_in 'user_password', :with => 'testpassword'
    click_button 'Sign in'
    expect(page).to have_content('Dashboard')
  end

  scenario 'with invalid credentials' do
    visit admin_root_path
    fill_in 'user_email', :with => 'email@email.com'
    fill_in 'user_password', :with => 'wrongpassword'
    click_button 'Sign in'
    expect(page).to have_content('Admin Login')
  end

end

テストを実行すると、次のエラーが発生します。

1) Admin signs in test with invalid credentials
 Failure/Error: FactoryGirl.create(:user)
 ActiveRecord::RecordInvalid:
   Validation failed: Email has already been taken

DatabaseCleaner は変更を元に戻すと思っていましたが、ユーザー レコードは 2 番目のシナリオ ブロックまでデータベースに残っているようです。

最初のシナリオの後にデータベースが確実にクリーンアップされるようにするにはどうすればよいですか?

この投稿に従ってデータベースクリーナーを構成しました

# support/database_cleaner_spec.rb

RSpec.configure do |config|
  config.before(:suite) do
    DatabaseCleaner.clean_with(:truncation)
  end

  config.before(:each) do
    DatabaseCleaner.strategy = :transaction
  end

  config.before(:each, :js => true) do
    DatabaseCleaner.strategy = :truncation
  end

  config.before(:each) do
    DatabaseCleaner.start
  end

  config.after(:each) do
    DatabaseCleaner.clean
  end

end

また、仕様ヘルパー ファイルを次のように更新しました。

config.use_transactional_fixtures = false
4

5 に答える 5

8

spec/rails_helper.rb に次の設定があることを確認してください

RSpec.configure do |config|
 config.use_transactional_fixtures = true
end

アイデアは、クリーンなデータベースで各例を開始し、その例に必要なデータを作成し、例の最後でトランザクションをロールバックするだけでそのデータを削除することです。

于 2015-04-06T08:16:58.847 に答える