我是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 =>如果
失败,则为truecannot 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而失败?
答案 0 :(得分:107)
我在https://github.com/jnicklas/capybara阅读了Capybara自述文件,它解决了我的问题。
事务性灯具仅适用于默认的Rack :: Test驱动程序,但是 不适合像Selenium这样的其他司机。黄瓜会照顾这个 自动,但使用Test :: Unit或RSpec,您可能必须使用 database_cleaner gem。请参阅this explanation(以及solution 2的代码 和solution 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
答案 1 :(得分:9)
brutuscat's answer的变体修复了我们的功能规格(全部使用了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
答案 2 :(得分:7)