在先前的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(它是登录用户的方法的一部分,这是两组集成测试所必需的。)
我尝试了什么:
我尝试使用capybara WebKit documentation提供的调试代码:
Capybara::Webkit.configure do |config|
config.debug = true
我把它放在我的spec_helper.rb中。但这最终会给我另一条错误信息,即:NoMethodError: undefined method configure' for Capybara::Webkit:Module
。
spring stop
和spring restart
)。仍然没有任何工作。 (我尝试在两个命令之后运行测试,并且两次仍然得到相同的错误消息)关于我的配置的说明:
当我收到项目时,spec_helper.rb文件有Capybara.server_port = 5000
,我没有改变它。然后在所有visit
方法中使用此变量(例如,“访问”http://my.server:# {Capybara.server_port} /“)。
没有包含Capybara.app_host = ______
此网络应用包含三个我需要能够访问的子域:cms.my.server
,www.my.server
和admin.my.server
。 (请记住,my.server
是实际服务器名称的替代,我出于法律原因无法使用该名称。所有这三个都设置为在我的主机文件中解析为127.0.0.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上)。