Jest是否在每个套件或测试后重置JSDOM文档?

时间:2017-03-15 09:00:00

标签: testing jestjs jsdom

我正在测试在安装和卸载时到达DOM结构之外的几个组件,以提供其他方式无法实现的特定交互功能。

我正在使用Jest和默认的JSDOM初始化来在节点内创建类似浏览器的环境。我在文档中找不到任何建议Jest在每次测试执行后重置JSDOM的内容,并且如果不是这样的话,没有关于如何手动执行此操作的明确文档。

我的问题是,Jest是否在每次测试,套件之后重置JSDOM实例,还是在所有测试运行中保留一个JSDOM实例?如果是这样,我该如何控制它?

3 个答案:

答案 0 :(得分:16)

纠正(误导性)接受的答案并明确强调以前评论之一的非常重要的信息:

  

没有。每次测试运行后,Jest 都不会清理JSDOM文档!它只在完成整个文件中的所有测试后清除DOM。

这意味着在每次单次测试运行后,必须手动清理测试期间创建的资源。否则会导致共享状态,从而导致非常微妙的错误,难以跟踪。

以下是在jest测试套件中每次单个测试后清理JSDOM的一种非常简单但有效的方法:

describe('my test suite', () => {
  afterEach(() => {
    document.getElementsByTagName('html')[0].innerHTML = ''; 
  });

  // your tests here ...
});

答案 1 :(得分:1)

所有jest测试文件都在自己的线程中运行,因此它们之间没有任何共享,这就是为什么你不需要在测试运行后重置模拟或间谍的原因。从Jest页面:

  

Jest将测试运行并行化,以最大限度地提高性能。   控制台消息被缓冲并与测试结果一起打印。   沙盒测试文件以及每次测试的自动全局状态重置   所以没有两个测试相互冲突。

答案 2 :(得分:0)

Rico Pfaus是正确的,尽管我发现以他建议的方式重置innerHTML太具有破坏性,并导致测试失败。相反,我发现选择要从文档中删除的特定元素(按类或ID)更有效。

rangeObj = ws.Range('o39:o39')
rangeObj.EntireColumn.Insert()