当 运行 RSpec 测试 :js => true 时,capybaraWebKit 无法访问网页

capybaraWebKit is unable to visit webpages when running RSpec tests when :js => true

在之前的 RSpec 集成测试中,其中 :js => false(即 JavaScript 被关闭),我的测试 运行ning 很好。但是,对于 :js => true 的 RSpec 测试(因此需要使用 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 时工作正常(它是登录用户的方法的一部分,这对两组集成测试都是必需的)。

我试过的:

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

我的配置注意事项:

另请注意,我的队友进行了完全相同的测试。

假设您使用的是标准 Capybara rspec 配置,当指定 js: false 时(或未指定 js 元数据),那么 Capybara 将使用 rack_test driver。 rack_test driver 完全忽略指定的所有主机名和端口,并将 "requests" 直接提交给 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

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