Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/463.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 水豚:js=>;true导致测试失败_Javascript_Ruby On Rails 3_Capybara - Fatal编程技术网

Javascript 水豚:js=>;true导致测试失败

Javascript 水豚:js=>;true导致测试失败,javascript,ruby-on-rails-3,capybara,Javascript,Ruby On Rails 3,Capybara,我对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 + " " +

我对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)

我想我还不太明白为水豚打开JS是做什么的


为什么在JS开启的情况下测试会失败?

我在上阅读了《水豚自述》,它解决了我的问题

事务性装置仅在默认的Rack::Test驱动程序中工作,但 不适用于像Selenium这样的其他驱动程序。Cucumber负责这个 自动,但对于Test::Unit或RSpec,您可能必须使用 数据库清理器。请参阅(和代码) 及)了解详情

但基本上这是一个线程问题,涉及到在运行非机架驱动程序时水豚有自己的线程,这使得事务性fixture功能在另一个上下文中使用第二个连接。因此,驱动程序线程永远不会与正在运行的rspec处于相同的上下文中

幸运的是,通过在DatabaseCleaner策略中进行动态切换,可以轻松解决这一问题(至少对我来说是这样):

RSpec.configure do|config|
config.use\u transactional\u fixtures=false
config.before:each do
如果Capybara.current\u driver==:机架\u测试
DatabaseCleaner.strategy=:事务
其他的
DatabaseCleaner.strategy=:截断
结束
DatabaseCleaner.start
结束
config.after do
DatabaseCleaner.clean
结束
结束

这里介绍和讨论了另一种解决此问题的方法:

这是我们的功能规范(都使用水豚)的一种变体:


这可能是因为JS开启时使用了不同类型的选择器。我以前也遇到过类似的奇怪问题。您能否修改您的测试并使您选择的选项更简单(不带“-”)例如
select(@project.name,:from=>“assignment\u project\u id”)
只是为了测试一下,看看会发生什么?谢谢您的想法。我试过了,但不幸的是没用。现在只需获取“no option with text‘Test project’”,现在看来,我将使用的解决方法是用数据填充测试数据库,并将每个测试隔离为只需要数据库中的数据。也许从一开始就应该这样做,但我的印象是,你可以使用水豚插入一条记录,然后对插入的数据进行操作,只要它在同一个“it”块中。我也有这个问题。我使用的是rspec和factory_girl,当使用:js=>true时是这样的,数据库中没有填充任何记录…搞定了-谢谢!另外,由于jnicklas对邮件列表的解释,我现在明白了为什么它能工作了-谢谢指针。太好了-非常感谢!确认这与
水豚webkit
同样有效谢谢,这篇文章真的很有帮助!:)您只需将策略设置为功能规格的截断,就像@Aidan的回答一样。需要注意的是,Rails(5+)的最新版本,甚至更早版本在EvilMartians的共享连接后端口的帮助下,都支持事务性功能,您一定要研究它以节省大量时间。看见
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