そのため、RSpec Capybara テストにトランケーション クリーニング戦略を使用するように RSpec 環境をセットアップしましたが、Javascript ドライバーとして Webkit を使用すると、何かがまだテストをトランザクションにラップしていることに気付きます。
私は Selenium でこの問題を抱えていません。
Webkit に関連する RSpec 構成は次のとおりです。
Capybara.javascript_driver = :webkit
Capybara.register_driver :webkit do |app|
Capybara::Webkit::Driver.new(app).tap do |driver|
driver.allow_url "fonts.googleapis.com"
driver.allow_url "dl.dropboxusercontent.com"
end
end
config.before(:suite) do
DatabaseCleaner.clean_with :truncation
DatabaseCleaner.clean_with :transaction
end
config.after(:each) do
ActionMailer::Base.deliveries.clear
end
config.around(:each, type: :feature, js: true) do |ex|
DatabaseCleaner.strategy = :truncation
DatabaseCleaner.start
self.use_transactional_fixtures = false
ex.run
self.use_transactional_fixtures = true
DatabaseCleaner.clean
end
そして、私の機能テストは次のようになります。
feature "profile", js: true do
describe "a confirmed user with a valid profile" do
before(:each) do
@user = FactoryGirl.create :user
signin(@user.email, @user.password)
end
scenario 'can edit name' do
visit edit_user_profile_path
fill_in :user_name, with: 'New name'
click_button :Submit
@user.reload
expect(@user.name).to eq('New name')
expect(current_path).to eq show_user_path
end
end
end
このテストを Webkit で実行すると失敗しますが、Selenium では成功します。
私はいくつかのデバッグを試しました。#update アクションに debugger ステートメントを入れると、データベースが正しく更新されることがわかります。その時点でテスト データベースに接続すると、データベースに新しい情報が表示されます。つまり、この更新をトランザクションでラップすることはできません。ただし、.spec @user のデバッガーでは、factory_girl で FFaker によって生成された元の名前がまだ表示されます。これにより、テストはトランザクション内で実行されると思われます。
JavaScript ドライバーを Selenium に変更すると、すべて正常に動作します。
何か案は?