typescript 在Jest中测试时未定义自定义全局函数;未测试时工作正常

km0tfn4u  于 2022-11-30  发布在  TypeScript
关注(0)|答案(1)|浏览(268)

bounty将在4天后过期。回答此问题可获得+50声望奖励。GROVER.希望吸引更多人关注此问题。

我在Express应用中有一个自定义的全局作用域函数foo。当运行我的Jest test脚本时,这个函数被捕获为undefined。因此,使用它们的任何测试都会失败。
index.d.ts

declare global{
    function foo(): string;
}
export {};

src/Utils/index.ts

global.foo = function foo(){
    return "bar";
};

src/Modules/Example.module.ts

export const test = () => {
    // This will return bar, as expected, when developing.
    // A reference error will only be thrown when running npm test.
    return foo();
};

src/Modules/Example.test.ts

import { test } from "./Example.module";

describe("modules/example", () => {
    describe("test", () => {
        it("returns bar", () => {
            let bar = test();
            expect(bar).toBe("bar");
        });
    });
});

尽管这在开发时不是问题,但此测试会导致错误:

ReferenceError: foo is not defined.

export const test = () => {
    return foo();
           ^
    ...
};
elcex8rz

elcex8rz1#

您可以指定src/Utils/index.ts作为安装文件,Jest将在运行测试之前加载并执行它。您可以将它添加到您的Jest配置文件中(如果您没有配置文件,也可以创建一个):
假设一个CJS格式的Jest配置jest.config.js:

module.exports = {
  // Your other configuration options

  "setupFiles": ["<rootDir>/src/Utils/index.ts"]
};

如果您使用JSON或TypeScript Jest配置文件,它看起来会稍有不同。
但是我不推荐使用全局变量(即使你经常使用它们)。有了一个正确的代码编辑器设置,从另一个文件导入函数是很容易的。

相关问题