在以下情况下运行RSpec测试时,capybaraWebKit无法访问网页:js =>真

时间:2016-12-12 01:46:16

标签: ruby-on-rails rspec capybara capybara-webkit

在先前的RSpec集成测试中,其中:js => false(即JavaScript被关闭),我的测试运行得很好。但是,对于RSpec测试,其中:js => true(因此需要使用capybara WebKit),我一直收到以下错误:

Unable to load URL: http://my.server:5000/auth/identity because of error loading http://my.server:5000/auth/identity: Unknown error

注意到这发生在一行代码正常工作时:js => false(它是登录用户的方法的一部分,这是两组集成测试所必需的。)

我尝试了什么:

  • 使用ufw(因为我在Ubuntu上运行),我确保端口5000已打开。但是,我不认为这是问题,因为在以下情况下,测试能够在其他测试中使用相同的端口运行良好:js =>假的
  • 访问其他网页(例如http://my.server:5000/),但会显示相同的错误消息。
  • 我尝试使用capybara WebKit documentation提供的调试代码:

    Capybara::Webkit.configure do |config| config.debug = true

我把它放在我的spec_helper.rb中。但这最终会给我另一条错误信息,即:NoMethodError: undefined method configure' for Capybara::Webkit:Module

  • 我尝试按照these说明停止并重新启动spring(使用spring stopspring restart)。仍然没有任何工作。 (我尝试在两个命令之后运行测试,并且两次仍然得到相同的错误消息)

关于我的配置的说明:

  • 当我收到项目时,spec_helper.rb文件有Capybara.server_port = 5000,我没有改变它。然后在所有visit方法中使用此变量(例如,“访问”http://my.server:# {Capybara.server_port} /“)。

  • 没有包含Capybara.app_host = ______

  • 的行
  • 此网络应用包含三个我需要能够访问的子域:cms.my.serverwww.my.serveradmin.my.server。 (请记住,my.server是实际服务器名称的替代,我出于法律原因无法使用该名称。所有这三个都设置为在我的主机文件中解析为127.0.0.1。

另请注意,我的队友已经完成了相同的测试。

1 个答案:

答案 0 :(得分:2)

假设您正在使用标准的Capybara rspec配置,当指定js: false(或未指定js元数据)时,Capybara将使用rack_test驱动程序。 rack_test驱动程序完全忽略指定的所有主机名和端口,并将“请求”直接提交给rails应用程序路由处理程序。因此,如果你告诉它连接到http://my.server:5000它只是直接到目的地为/的路由处理程序 - 所以当指定js: false时它工作的事实不会这意味着端口5000实际上正在做任何事情。

要回答的问题是为什么Capybara正在尝试连接到端口5000.在测试使用正常Capybara的应用程序时,Capybara将在一个单独的线程中启动应用程序并将其绑定到随机端口上的127.0.0.1。随机端口不太可能是5000,绝对不会连续多次运行。从这里我们正在猜测领域(没有看到你的Capybara配置),但是你可能已经指定了Capybara.app_host = 'http://my.server:5000',只有当你将它组合Capybara.server_port = 5000时才会起作用,从而迫使Capybara在端口5000上绑定它的服务器。首选方案是

Capybara.app_host = 'http://my.server'
Capybara.always_include_port = true

这将让capybara选择一个随机端口,然后将其添加到每个visit调用中(注意:这都假设'my.server'确实解析为您正在测试的机器上的127.0.0.1上)。

相关问题