我正在测试在安装和卸载时到达DOM结构之外的几个组件,以提供其他方式无法实现的特定交互功能。
我正在使用Jest和默认的JSDOM初始化来在节点内创建类似浏览器的环境。我在文档中找不到任何建议Jest在每次测试执行后重置JSDOM的内容,并且如果不是这样的话,没有关于如何手动执行此操作的明确文档。
我的问题是,Jest是否在每次测试,套件之后重置JSDOM实例,还是在所有测试运行中保留一个JSDOM实例?如果是这样,我该如何控制它?
答案 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()