Capybara:js => true导致测试失败

eva*_*mcd 50 javascript capybara ruby-on-rails-3

我是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
Run Code Online (Sandbox Code Playgroud)

它按原样传递,但如果我添加:js => true则失败

cannot select option, no option with text 'Test client - Test project' in select box 'assignment_project_id'
Run Code Online (Sandbox Code Playgroud)

我正在使用FactoryGirl来创建数据,并且由于测试在没有JS的情况下通过,我知道该部分正在运行.

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

我想我不太了解为Capybara开启JS的目的是什么.

为什么测试会因JS而失败?

bru*_*cat 107

我在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
Run Code Online (Sandbox Code Playgroud)


Aid*_*man 9

修改我们的功能规格(全部使用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
Run Code Online (Sandbox Code Playgroud)


Lar*_*ter 7

还有另一种方法来处理这里现在描述和讨论的这个问题:为什么不为Rspec + Selenium使用共享的ActiveRecord连接?