[英]Capybara with :js => true causes test to fail
我是Capybara的新手並且一般都在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)
我想我不太了解為Capybara開啟JS的目的是什么。
為什么測試會因JS而失敗?
我在https://github.com/jnicklas/capybara上閱讀了Capybara自述文件,它解決了我的問題。
事務夾具僅適用於默認的Rack :: Test驅動程序,但不適用於Selenium等其他驅動程序。 Cucumber會自動處理這個問題,但是使用Test :: Unit或RSpec,您可能必須使用database_cleaner gem。 有關詳細信息,請參閱此說明 (以及解決方案2和解決方案3的代碼)。
但基本上它是一個線程問題,涉及Capybara在運行非Rack驅動程序時擁有自己的線程,這使得事務夾具功能在另一個上下文中使用第二個連接。 因此驅動程序線程永遠不會在運行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
修改我們的功能規格(全部使用Capybara)的brutuscat答案的變體:
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連接?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.