改变DOM——如何编写一个单元测试来检查脚本是否对页面上的元素进行任何用户可见的更改

Diffing the DOM - how to write a unit test that checks that a script doesn't make any user-visible changes to elements on the page?

本文关键字:元素 任何 用户 是否 何编写 DOM 检查 脚本 单元测试 一个 改变      更新时间:2023-09-26

我最近一直在写的一个JavaScript插件有各种内置的故障保护,告诉整个插件或部分插件隐藏自己并在无法运行的情况下死亡。例如,假设我们提供的一项功能是,当用户在在线商店中将鼠标悬停在某件商品上方时,自动生成一个弹出窗口,显示竞争对手的价格。然后我们还有一些检查,如果我们不知道任何竞争对手的价格,或者我们不能识别商品,那么就不显示弹出窗口。

我想使用大致遵循以下结构的测试来测试功能禁用:

  1. 将插件加载到应该禁用某些功能的页面
  2. 欺骗一些用户操作,否则会触发该功能
  3. 断言没有对DOM进行任何可见的更改。(即不改变可见元素的样式,不添加或删除元素,除非它们有display:none)

步骤#3当然是有趣的一个。是否有一种简单的方法来编写"DOM不变"的JavaScript测试?(或者在Selenium for Python中,这是我用来编写测试的——但是在JavaScript中编写检查可能更广泛,因为它可以在任何JavaScript测试环境中使用。)


注:下面是一些建议,让你远离那些"你做错了!"的人群:

  • 是的,我知道我可以用检查特定的更改来代替上面测试中的步骤#3,否则插件将不会做出更改,我甚至可能决定这样做。但是,当这些具体的变化是不规范的,容易改变的时候,这种包罗万象的方法可能是有用的。

  • 是的,我也意识到,只是检查没有立即视觉变化的DOM,当一个事件意味着是无效果的触发是严格不足以证明什么都没有坏。不过这对我目前的目的来说是最好的。另外,即使它被证明没有用处,它也很有趣。

使用突变观察器来检测没有发生突变。您可能想签出Mutation Summary,这是一个非常好的用于突变观察者的高级包装器。检查是否发生了突变就像检查返回的数组的长度是否为0一样简单。参见https://code.google.com/p/mutation-summary/。

相关文章: