javascript - Jest 导入普通 javascript 会导致意外的 token

标签 javascript jestjs

首先:据我所知,这不是重复的。具有类似问题的其他问题都略有不同,例如使用像 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-corejest-configjest-runtime 的节点模块目录的临时修复。上一个链接中也描述了此脏修复。

我还没有找到一个干净的解决方案,但至少这是可行的。

关于javascript - Jest 导入普通 javascript 会导致意外的 token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54399495/

相关文章:

javascript - 在 Angularjs 指令中配置 CkEditor 工具栏

javascript - 如何使用 ExtendScript 在 InDesign 中以编程方式将文本设置为 "Small Caps"?

reactjs - 如何使用jest和enzyme测试react中的API调用?

node.js - 如何在 NestJS 中模拟存储库、服务和 Controller (Typeorm 和 Jest)

reactjs - 使用 React 测试库测试登录功能

javascript - 如何在 Angular Material 表中定义索引

javascript - jQuery append() 空元素

javascript - 编辑布局以在元素之间使用垂直规则。

javascript - 如何在模拟的 Jest 函数中使用 var 作为返回值?

javascript - Jest 中的模拟 shell 命令输出