2011-11-18 104 views
48

我是新来的水豚和一般的测试Rails,所以请原谅我,如果这是一个简单的答案。水豚与:js =>真正导致测试失败

我有了这个测试

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 =>真正的失败与

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

我使用FactoryGirl创建数据,而且由于测试通过没有JS,我知道这部分工作。

我已经尝试用默认的JS驱动程序,并用:(安装了水豚,WebKit的),WebKit的驱动

我想我不明白就够了转折点上JS的水豚在做什么。

为什么JS上的测试失败?

+0

这可能是因为JS打开时使用不同类型的选择器。我遇到过类似的奇怪问题,就像之前那样。你可以修改你的测试,并选择你选择更简单(没有“ - ”)例如'select(@ project.name,:from =>“assignment_project_id”)'来测试它,看看会发生什么? –

+0

感谢您的想法。试过了,但不幸的是它没有奏效。现在只是“没有选项和文本”测试项目“” – evanmcd

+0

现在看来,我将使用的解决方法是使用数据填充测试数据库,并将每个测试隔离为只需要数据库中的数据。也许这是从一开始就应该如何完成的,但我的印象是你可以使用Capybara插入一条记录,然后只要它在同一个“it”块内,就对来自该插入的数据起作用。 – evanmcd

回答

105

我读过水豚自述https://github.com/jnicklas/capybara它解决了我的问题。

事务灯具仅在默认的机架::测试驱动程序,但 不为其他驱动器,如硒。黄瓜自动处理此 ,但使用Test :: Unit或RSpec,您可能必须使用 database_cleaner宝石。有关详细信息,请参阅this explanation(和代码solution 2solution 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 
+0

钉了它 - 谢谢!也 - 我现在明白了为什么它的工作得益于jnicklas的邮件列表解释 - 感谢指针。 – froderik

+0

完美 - 谢谢!确认这也适用于'capybara-webkit' – FeifanZ

+0

太棒了!只是FYI这与铬驱动程序也可以 – Nobita

8

brutuscat's answer的变化是固定我们的功能规格(所有使用水豚):

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