如何找出 rails 功能测试失败的原因
How to find out why rails feature test fails
我们目前正在开发一款地图软件,我们在其中使用带有自定义左侧边栏和右侧边栏的 Leaflet 以及我们过滤不同 POI 功能的文本过滤器。整个事情看起来像这样:
流程如下
- 一个用户访问了一个唯一的地图link
- 控制器首先呈现 HTML 模板(未发布数据)
- 在我们的 javascript 中,一个 ajax 调用获取数据并呈现标记、一些面板等
我们使用水豚和 poltergeist 进行所有功能测试。
在我们的 master 中,一切正常。
在另一个分支中,我添加了密码保护,因此如果地图受密码保护并且在当前会话中尚未解锁,则会弹出 bootstrap 模式。
除了一些最近失败的功能测试外,一切都很好,而且在弄乱了一些东西之后,我仍然不知道为什么。
让我们以这个测试为例
feature 'Places map filter', js: true do
before do
@map = create :map, :full_public
create :place, :unreviewed, categories: 'Playground', map: @map
visit map_path(map_token: @map.public_token)
find('.open-sidebar').trigger('click')
end
scenario 'Nothing filters nothing' do
show_places
show_events
show_places_list_panel
expect(page).to <...>
end
...
end
Capybara 声称无法找到某些 css 元素。调用 screenshot_and_open_image
显示它仍在显示叠加层(隐藏其他所有内容),直到所有数据都已加载。我的 Javascript...
里好像有什么东西挂着
.
我一直在弄乱测试环境,这产生了影响:
config.action_controller.asset_host = "file://#{::Rails.root}/public"
config.assets.prefix = 'assets_test'
测试通过,因为数据已经存在。屏幕截图显示了丢失的资产,这是由适当的警告消息 Not allowed to load local resource: <path>
引导的。我很困惑,因为查询数据是通过 ajax 调用从水豚告诉无法访问的文件之一进行的。
我不知道如何继续,因为我不想开始跳过测试。希望大家能帮我指点一下错误。
提前致谢,
安迪
更新
感谢 Thomas 对 ES6 功能的提示。我使用了 poltergeist 的检查员模式,因此能够发现我引入的箭头功能!这就是为什么 JS 驱动程序无法处理我传递给未解决的承诺的回调...
首先,请确保您的 Poltergeist 驱动程序注册中有 js_errors: true
- https://github.com/teampoltergeist/poltergeist#customization - 以便报告运行时 JS 错误。
其次,如果您在 JS 代码中使用任何 ES6+ 功能,请确保将它们转译为 ES5 兼容代码,因为 Poltergeist/PhantomJS 仅支持 JS <= ES5,并且会在 JS 解析时静默失败如果它使用 let
.
等功能解析 JS
最后,通过使用 trigger
,您可以绕过 Poltergeists 检查按钮是否真的可以被用户点击,因此请确保您没有过早地点击按钮(在任何行为附加到按钮实际上是附加的)
我们目前正在开发一款地图软件,我们在其中使用带有自定义左侧边栏和右侧边栏的 Leaflet 以及我们过滤不同 POI 功能的文本过滤器。整个事情看起来像这样:
流程如下
- 一个用户访问了一个唯一的地图link
- 控制器首先呈现 HTML 模板(未发布数据)
- 在我们的 javascript 中,一个 ajax 调用获取数据并呈现标记、一些面板等
我们使用水豚和 poltergeist 进行所有功能测试。
在我们的 master 中,一切正常。 在另一个分支中,我添加了密码保护,因此如果地图受密码保护并且在当前会话中尚未解锁,则会弹出 bootstrap 模式。
除了一些最近失败的功能测试外,一切都很好,而且在弄乱了一些东西之后,我仍然不知道为什么。
让我们以这个测试为例
feature 'Places map filter', js: true do
before do
@map = create :map, :full_public
create :place, :unreviewed, categories: 'Playground', map: @map
visit map_path(map_token: @map.public_token)
find('.open-sidebar').trigger('click')
end
scenario 'Nothing filters nothing' do
show_places
show_events
show_places_list_panel
expect(page).to <...>
end
...
end
Capybara 声称无法找到某些 css 元素。调用 screenshot_and_open_image
显示它仍在显示叠加层(隐藏其他所有内容),直到所有数据都已加载。我的 Javascript...
我一直在弄乱测试环境,这产生了影响:
config.action_controller.asset_host = "file://#{::Rails.root}/public"
config.assets.prefix = 'assets_test'
测试通过,因为数据已经存在。屏幕截图显示了丢失的资产,这是由适当的警告消息 Not allowed to load local resource: <path>
引导的。我很困惑,因为查询数据是通过 ajax 调用从水豚告诉无法访问的文件之一进行的。
我不知道如何继续,因为我不想开始跳过测试。希望大家能帮我指点一下错误。
提前致谢, 安迪
更新
感谢 Thomas 对 ES6 功能的提示。我使用了 poltergeist 的检查员模式,因此能够发现我引入的箭头功能!这就是为什么 JS 驱动程序无法处理我传递给未解决的承诺的回调...
首先,请确保您的 Poltergeist 驱动程序注册中有 js_errors: true
- https://github.com/teampoltergeist/poltergeist#customization - 以便报告运行时 JS 错误。
其次,如果您在 JS 代码中使用任何 ES6+ 功能,请确保将它们转译为 ES5 兼容代码,因为 Poltergeist/PhantomJS 仅支持 JS <= ES5,并且会在 JS 解析时静默失败如果它使用 let
.
最后,通过使用 trigger
,您可以绕过 Poltergeists 检查按钮是否真的可以被用户点击,因此请确保您没有过早地点击按钮(在任何行为附加到按钮实际上是附加的)