[英]Jest can't find module
我刚开始使用 Jest,我正在尝试测试此代码,该代码将在 1000 毫秒后更改元素的 textContent:
const subtext = document.querySelector('.subtext');
function delayChangeText() {
setTimeout(() => {
subtext.textContent = "Dev";
}, 1000);
}
subtext.addEventListener('load', delayChangeText);
这是 Jest 返回的内容:
FAIL js/app.test.js
● Test suite failed to run
Cannot find module './delayChangeText' from 'js/app.test.js'
> 1 | const delayChangeText = require('./delayChangeText');
| ^
2 |
3 | test('Change the text after 1000 seconds', () => {
4 | expect(delayChangeText().toBe(subtext.textContent = "Dev"));
at Resolver.resolveModule (node_modules/jest-resolve/build/resolver.js:311:11)
at Object.<anonymous> (js/app.test.js:1:1)
Test Suites: 1 failed, 1 total
Tests: 0 total
Snapshots: 0 total
Time: 0.846 s
我对测试还是很陌生,我相信我做了一个非常简单的傻事。 任何帮助深表感谢。 最好的祝福。
测试的第零规则是:
并非所有代码都可以测试。 有时,您必须更改实际代码的编写方式,以便测试框架可以掌握代码。
我可以看到一两个关键问题。
第一:我假设您没有包含应用程序的全部内容,但看起来您的应用程序代码没有导出delayChangeText
函数,这意味着其他模块(例如您的测试套件)无法导入它。
您可能需要执行类似module.exports = delayChangeText
,或者在您的应用程序代码中export default delayChangeText
。
第二:你的函数不是纯函数。 也就是说,这取决于这不是传递给它明确的东西,即它预期subtext
是它的执行上下文中定义。
并不是严格要求您的所有函数都是纯函数,实际上有时这是不可能的。 但是纯函数通常更容易测试(也更容易设计和实现)。 这是您的函数的纯版本:
function delayChangeText(element) {
setTimeout(() => {
element.textContent = "Dev";
}, 1000);
}
您不必将其转换为一个纯粹的功能,但除非你的测试套件采取措施,以确保您的代码将在测试中打破subtext.textContent
不会抛出-如果subtext
是不明确的,它会抛出。
这是另一个重要原因:如果这个模块的默认出口是delayChangeText
功能,那么它可能不适合前面的subtext
分配即使是在文件中。 这意味着解决第一个问题(“它没有被导出”)自然会导致将函数转换为纯函数。 如果您真的想避免这种情况,您可以:您可能必须将函数在测试套件中的导入方式更改为:
const { delayChangeText } = require('./delayChangeText');
最后(并且您没有问这个问题——还没有):您可能不希望此测试实际上必须等待 1000 毫秒来测试此功能。 Jest 有一些用于操作全局计时器函数的工具,这将使您无需等待即可验证该函数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.