如何设置 capybara-webkit 以测试 ajax 调用并获取屏幕截图(html 加载 css 和 javascript)

how to setup capybara-webkit to test ajax calls and get screenshots(html with css and javascript loaded)

我正在为我的小 rails 4.2.1 应用程序上的 capybara-webkit 设置而苦苦挣扎。测试正在 运行ning,正在点击页面上的链接并且 ajax 调用正在测试中工作。 在我开始使用 capybara-screenshot gem 之后,除了一个奇怪的问题外,一切似乎都正常。我的目标是获得加载了所有资产的 html 屏幕截图,使屏幕截图看起来像在现实生活中一样。

因此,在获取屏幕截图时,我得到了两个文件:'png' 和 'html' 文件。 查看 'html' 文件时(例如 file:///Users/monk/dev/things/tmp/capybara/screenshot_2015-08-31-16-06-51.840.html),它没有加载 css。我发现资产路径与屏幕截图文件位置不同...... 好的,所以我通过添加以下内容在 'config/environments/test.rb' 文件中配置了我的测试环境:

config.action_controller.asset_host = "file://#{::Rails.root}/public"
config.assets.compile = true
config.assets.digest = true

第一行为页面上的所有资产 url 添加指定前缀,第二行编译资产,第三行将摘要哈希添加到资产文件。所以所有的东西看起来更像是在生产环境中。

这使得 html 屏幕截图显示为按预期加载 css 和 javascript。 但是...当我 运行 相同的测试时,ajax 调用不再被正确调用.. 我得到错误

Failure/Error: Unable to find matching line from backtrace
ActionController::RoutingError:
  No route matches [GET] "/things/ajax_calculate_it"

因此,一旦我更改默认值 asset_host.asset_host,ajax 调用就会在所有测试中失败。

以下是 5 月测试页上的 ajax 调用示例:

<a class=" calculable " data-remote="true" rel="nofollow" data-method="post" href="/things/ajax_calculate_it?a=5&b=48">Calculate it</a>

为什么这个调用使用 GET 而不是 POST? 必须有一些简单的配置。我在这里缺少什么配置?

好的... 看来我自己找到了答案。

简单地改变了这个

config.action_controller.asset_host = "file://#{::Rails.root}/public"

至此

config.action_controller.asset_host = "http://localhost:3000"

在那之后似乎没有问题。 Ajax 按预期调用,屏幕截图也按预期加载了 css 和 javascript。

而不是设置 action_controller asset_host 这将改变您的页面在测试期间的生成方式(并且意味着测试现在依赖于测试服务器和开发服务器,可能会不同步可能会出现的问题)最好设置 Capybara 的资产主机

Capybara.asset_host = "http://local host:3000"

这将导致水豚向任何已保存的 html 页面添加基本标记,这意味着只有那些已保存的页面取决于开发服务器 运行 而不是您的所有测试。