首先:据我所知,这不是重复的。具有类似问题的其他问题都略有不同,例如使用像 babel 这样的转换或者在传递导入方面有问题。在我的例子中,我没有转换,我有一个测试文件和一个将被测试的导入文件。我刚开始用jest,用的是默认设置,所以没有配置文件贴出来。
当我尝试运行我的测试时,我收到错误消息:
Test suite failed to run
Jest encountered an unexpected token
This usually means that you are trying to import a file which Jest cannot parse, e.g. it's not plain JavaScript.
测试文件:
export function showTooltip(x, y, content) {
const infoElement = document.getElementById('info');
infoElement.style.left = `${x}px`;
infoElement.style.top = `${y}px`;
infoElement.style.display = 'block';
infoElement.innerText = createTooltipText(content);
}
function createTooltipText(object) {
return Object.keys(object)
.filter(key => key != 'id')
.map(key => `${key} : ${object[key]}`)
.join('\n');
}
export function hideTooltip() {
const infoElement = document.getElementById('info');
infoElement.style.display = 'none';
}
测试:
import {showTooltip, hideTooltip} from '../../../src/public/javascripts/tooltip.js';
const TOOLTIP_DUMMY = {
style: {
left: 0,
top: 0,
display: '',
innerText: ''
}
};
test('showTooltip accesses the element with the id \'info\'', () => {
const getElementByIdMock = jest.fn(() => TOOLTIP_DUMMY);
document.getElementById = getElementByIdMock;
showTooltip(0, 0, {});
expect(getElementByIdMock).toHaveBeenCalledWith('info');
});
test('hideTooltip accesses the element with the id \'info\'', () => {
const getElementByIdMock = jest.fn(() => TOOLTIP_DUMMY);
document.getElementById = getElementByIdMock;
hideTooltip();
expect(getElementByIdMock).toHaveBeenCalledWith('info');
});
如您所见,我使用的是普通 javascript,所以我不确定在这里要做什么。错误消息提供了有关 Babel 的进一步提示,但实际上并不适用于我的情况。
旁注:我的测试可能有缺陷。我目前正在尝试弄清楚如何使用模拟来避免与文档交互,我不确定是否是这样。然而,这不是这个问题的重点,因为它不应该影响测试运行的能力,但我非常愿意接受建议。
编辑:为什么这不是 this question 的副本:有点像,但我觉得这个问题和接受的答案对我并没有真正帮助,希望有人能从中受益。
最佳答案
我找到了解决问题的方法:
如 this answer 中的建议,你需要使用 Babel。这可以按照建议完成 here , 但我用了 @babel/env-preset
正如 Babel 网站上所建议的那样。
这给我留下了 jest 内部使用 babel-core@6.26.3
的问题,但至少需要 babel 7。这个问题描述了here .我使用了从我的节点模块目录手动复制和覆盖 babel-core
到 jest-config
和 jest-runtime 的节点模块目录的临时修复
。上一个链接中也描述了此脏修复。
我还没有找到一个干净的解决方案,但至少这是可行的。
关于javascript - Jest 导入普通 javascript 会导致意外的 token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54399495/