gpt4 book ai didi

typescript - 你如何用 typescript Jest 在两次测试之间重置测试对象?

转载 作者:行者123 更新时间:2023-12-04 15:29:26 25 4
gpt4 key购买 nike

我正在使用 typescript 和开 Jest 。我正在尝试执行一个非常简单的单元测试,但它总是失败。这是我的代码:

// init.ts
let initialized = false;
let secretName: string;

export function init(name: string) {
if (initialized) {
throw new Error("Cannot re-initialize.");
}

secretName = name;

initialized = true;
}

export function getSecret(): string {
return secretName;
}

// init.test.ts
describe("init", () => {
async function getTestSubject() {
return await import("./init");
}

it("should set the secret name properly", async () => {
const init = await getTestSubject();
init.init("bruce wayne");
expect(init.getSecret()).toEqual("bruce wayne");
});

it("should throw an exception if initialized more than once", async () => {
const init = await getTestSubject();

const callInit = function() {
init.init("bruce wayne");
};
callInit();
expect(callInit).toThrowError("Cannot re-initialize.");
});
});

由于抛出异常,第二个单元测试失败。当第一个“callInit()”被调用时,应该是第一次为该单元测试调用init。但是,这是在考虑两个单元测试时第二次调用它。

我认为通过在每个测试中动态导入测试主题(例如“./init”),我可以避免这个问题,因为我最初尝试像这样在顶部导入 init:

import {init, getSecret} from "./init";

关于如何测试这个的任何想法?我认为这是一个非常基本的测试用例,所以要么开 Jest 有很大的限制,要么我只是遗漏了一些明显的东西......

谢谢!

最佳答案

我可以通过调用 jest.resetModules() 来解决这个问题在 beforeEach()为了在每次测试之前重置模块命名空间。

let initModule

beforeEach(() => {
jest.resetModules()
initModule = require('./init')
})

it('should set the secret name properly', () => {
initModule.init('bruce wayne')
expect(initModule.getSecret()).toEqual('bruce wayne')
})

it('should throw an exception if initialized more than once', () => {
const callInit = () => initModule.init('bruce wayne')
callInit()
expect(callInit).toThrowError('Cannot re-initialize.')
})


您是正确的,这里有必要内联导入其他模块,因为使用标准 ES6 导入无法完成模块命名空间的重置。不过在上面的例子中,我使用了我认为更简单的 require()这样做的方法。

如果您正在使用 typescript 并且仍然希望强输入 initModule ,您仍然可以使用标准的 ES6 导入来导入它以获取类型。
import * as InitModule from './init'

let initModule: typeof InitModule

关于typescript - 你如何用 typescript Jest 在两次测试之间重置测试对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61534548/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com