web-dev-qa-db-ja.com

:js => trueのカピバラはテストが失敗する原因になります

私はカピバラの初心者であり、Railsで一般的にテストしているので、これが簡単な答えであれば許してください。

私はこのテストを持っています

it "should be able to edit an assignment" do
    visit dashboard_path
    select(@project.client + " - " + @project.name, :from => "assignment_project_id")
    select(@team_member.first_name + " " + @team_member.last_name, :from => "assignment_person_id")
    click_button "Create assignment"
    page.should have_content(@team_member.first_name)
end

それはそのまま渡しますが、:js => trueを追加すると失敗します

cannot select option, no option with text 'Test client - Test project' in select box 'assignment_project_id'

私はFactoryGirlを使用してデータを作成しています。JSなしでテストに合格すると、パーツが機能していることがわかります。

デフォルトのJSドライバーと:webkitドライバー(capybara-webkitがインストールされている)を試してみました

カピバラさんのJSをオンにするとどうなるか、よくわかりません。

JSをオンにするとテストが失敗するのはなぜですか?

50
evanmcd

https://github.com/jnicklas/capybara でカピバラのreadmeを読みましたが、問題は解決しました。

トランザクションフィクスチャは、デフォルトのRack :: Testドライバーでのみ機能し、Seleniumなどの他のドライバーでは機能しません。 Cucumberはこれを自動的に処理しますが、Test :: UnitまたはRSpecでは、database_cleaner gemを使用する必要がある場合があります。詳細は この説明 (および ソリューション2 および ソリューション のコード)を参照してください。

ただし、基本的には、Rack以外のドライバーを実行するときにCapybaraが独自のスレッドを持つスレッド化の問題があり、トランザクションフィクスチャー機能が別のコンテキストで2番目の接続を使用するようになります。そのため、ドライバースレッドが実行中のrspecのコンテキストと同じになることはありません。

幸いなことに、これは、使用するDatabaseCleaner戦略で動的切り替えを行うことで簡単に解決できます(少なくとも私にとっては解決されます)。

RSpec.configure do |config|
  config.use_transactional_fixtures = false

  config.before :each do
    if Capybara.current_driver == :rack_test
      DatabaseCleaner.strategy = :transaction
    else
      DatabaseCleaner.strategy = :truncation
    end
    DatabaseCleaner.start
  end

  config.after do
    DatabaseCleaner.clean
  end
end
107
brutuscat

brutuscatの回答 のバリエーションで、機能仕様(すべてCapybaraを使用)を修正しました。

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

config.before(:each) do
  # set the default
  DatabaseCleaner.strategy = :transaction
end

config.before(:each, type: :feature) do
  DatabaseCleaner.strategy = :truncation
end

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

config.append_after(:each) do
  DatabaseCleaner.clean
end
9
Aidan Feldman

この問題をここで説明および説明する別の方法があります。 Rspec + Seleniumに共有ActiveRecord接続を使用しないのはなぜですか?

7