如何找出 rails 功能测试失败的原因

How to find out why rails feature test fails

我们目前正在开发一款地图软件,我们在其中使用带有自定义左侧边栏和右侧边栏的 Leaflet 以及我们过滤不同 POI 功能的文本过滤器。整个事情看起来像这样:

流程如下

  1. 一个用户访问了一个唯一的地图link
  2. 控制器首先呈现 HTML 模板(未发布数据)
  3. 在我们的 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 检查按钮是否真的可以被用户点击,因此请确保您没有过早地点击按钮(在任何行为附加到按钮实际上是附加的)