水豚与:js =>真实导致testing失败

我是新来的水豚和一般的Railstesting,所以请原谅我,如果这是一个简单的答案。

我有这个testing

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来创build数据,而且当testing通过没有JS时,我知道该部分正在工作。

我已经尝试了默认的JS驱动程序,并使用:webkit驱动程序(安装了capybara-webkit)

我想我不明白为水豚做什么开启JS。

JS为什么会失败?

我已经阅读在https://github.com/jnicklas/capybara水豚自述,它解决了我的问题。;

交易装置仅在默认的Rack :: Test驱动程序中工作,但不适用于其他驱动程序,如Selenium。 黄瓜自动处理这个,但与testing::单位或RSpec,你可能不得不使用database_cleanergem。 有关详细信息,请参阅此解释 (以及解决scheme2和解决scheme3的代码)。

但是基本上它是一个线程问题,它涉及到Capybara在运行非Rack驱动程序时拥有自己的线程,这使得事务夹具在另一个上下文中使用第二个连接。 所以驱动程序线程永远不会在运行rspec的同一个上下文中。

幸运的是,这可以很容易地解决(至less它解决了我)在DatabaseCleaner策略dynamic切换使用:

 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的答案的变化,固定我们的function规格(都使用水豚):

 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连接?