1

そのため、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 に変更すると、すべて正常に動作します。

何か案は?

4

1 に答える 1

0

わお。質問を投稿した直後に問題を発見しました。トランザクションは関与しませんでした。

これは、バックエンドと webkit/selenium フロントエンドの間の競合の問題でした。Webkit では、コントローラーがデータベースを更新する前に、テストで @user.reload と expect ステートメントが実行されていました。Selenium では逆でした。

コツは、カピバラがページのリロードを待たされるようにすることです。テストを次のように変更しました。

scenario 'can edit name' do
  visit edit_user_profile_path

  fill_in :user_name, with: 'New name'
  click_button :Submit

  expect(current_path).to eq show_user_path
  @user.reload
  expect(@user.name).to eq('New name')
end
于 2015-02-14T09:56:02.783 に答える