私はカピバラの初心者であり、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をオンにするとテストが失敗するのはなぜですか?
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
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
この問題をここで説明および説明する別の方法があります。 Rspec + Seleniumに共有ActiveRecord接続を使用しないのはなぜですか?