Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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
Ruby on rails Rails:使用Capybara在多线程环境中浏览本地和远程页面_Ruby On Rails_Multithreading_Testing_Capybara_Phantomjs - Fatal编程技术网

Ruby on rails Rails:使用Capybara在多线程环境中浏览本地和远程页面

Ruby on rails Rails:使用Capybara在多线程环境中浏览本地和远程页面,ruby-on-rails,multithreading,testing,capybara,phantomjs,Ruby On Rails,Multithreading,Testing,Capybara,Phantomjs,在Rails应用程序中,我使用Capybara和Poltergeist和PhantomJS对用户定义的各种URL进行快照,并保存这些快照以供以后比较。由于快照执行使用Sidekiq在后台工作,因此使用默认(全局)Capybara会话将导致争用条件错误,因此我编写了一个帮助器方法来初始化每个线程的新Capybara会话: def new_capybara_session # When using Capybara / PhantomJS in a threaded environment li

在Rails应用程序中,我使用Capybara和Poltergeist和PhantomJS对用户定义的各种URL进行快照,并保存这些快照以供以后比较。由于快照执行使用Sidekiq在后台工作,因此使用默认(全局)Capybara会话将导致争用条件错误,因此我编写了一个帮助器方法来初始化每个线程的新Capybara会话:

def new_capybara_session
  # When using Capybara / PhantomJS in a threaded environment like Sidekiq,
  # each job needs its own separate session to prevent race conditions and
  # the consequent bizarre errors.
  Capybara::Session.new(:poltergeist)
end
只要快照代码设置为独占使用这个新会话,只要URL是远程的,我就不会在同时拍摄多个快照时遇到问题

然而,在我的测试套件中,我通过访问一个本地URL(即从Chrome中,我将一些随机网页保存到
/public/test\u sites/foo.html
等等)来练习这个快照代码。这些测试失败;tt证明我的新Capybara会话对象(使用上述方法初始化)无法加载本地URL,即使它可以加载远程URL。但是,如果我
包含Capybara::DSL
并使用全局/默认Capybara会话对象,我可以很好地加载远程和本地URL

为什么会这样?使用手动创建的Capybara::Session对象时,如何加载本地URL?如果我不能做到这一点,我就不能为快照代码编写彻底的测试。

请参阅。初始化Capybara::会话时,必须指定要使用的驱动程序,但也可以指定本地机架应用程序。后一个参数允许Capybara查找和加载本地URL。指定应用程序的最简单方法是使用
Capybara.app

我将创建新Capybara会话的方法更改为以下内容,之后我可以加载本地URL和远程URL:

def new_capybara_session
  # When using Capybara / PhantomJS in a threaded environment like Sidekiq,
  # each job needs its own separate session to prevent race conditions and
  # the consequent bizarre errors.
  Capybara::Session.new(:poltergeist, Capybara.app)
end