如何使用typescript在两次测试之间重置测试主题?

如何使用typescript在两次测试之间重置测试主题?,typescript,unit-testing,jestjs,Typescript,Unit Testing,Jestjs,我在用打字稿和笑话。我试图执行一个非常简单的单元测试,但它总是失败。这是我的密码: //init.ts 设initialized=false; 让secretName:string; 导出函数init(名称:string){ 如果(已初始化){ 抛出新错误(“无法重新初始化”); } secretName=名称; 初始化=真; } 导出函数getSecret():字符串{ 返回secretName; } //init.test.ts 描述(“初始化”,()=>{ 异步函数getTestSubj

我在用打字稿和笑话。我试图执行一个非常简单的单元测试,但它总是失败。这是我的密码:

//init.ts
设initialized=false;
让secretName:string;
导出函数init(名称:string){
如果(已初始化){
抛出新错误(“无法重新初始化”);
}
secretName=名称;
初始化=真;
}
导出函数getSecret():字符串{
返回secretName;
}
//init.test.ts
描述(“初始化”,()=>{
异步函数getTestSubject(){
返回等待导入(“/init”);
}
它(“应该正确设置秘密名称”,async()=>{
const init=await getTestSubject();
初始初始(“布鲁斯·韦恩”);
expect(init.getSecret()).toEqual(“布鲁斯·韦恩”);
});
它(“如果多次初始化,则应引发异常”,async()=>{
const init=await getTestSubject();
const callInit=函数(){
初始初始(“布鲁斯·韦恩”);
};
callInit();
expect(callInit).tothrower(“无法重新初始化”);
});
});
由于引发异常,第二个单元测试失败。当调用第一个“callInit()”时,这应该是该单元测试第一次调用init。但是,在考虑两个单元测试时,这是第二次调用它

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

从“/init”导入{init,getSecret};
关于如何测试这个有什么想法吗?我认为这是一个非常基本的测试用例,所以要么是有一个很大的限制,要么就是我遗漏了一些明显的东西


谢谢

我可以通过调用
beforeach()
在每次测试之前重置模块名称空间来实现这一点

let initModule
在每个之前(()=>{
jest.resetModules()
initModule=require(“./init”)
})
它('应该正确设置秘密名称',()=>{
initModule.init('bruce wayne')
expect(initModule.getSecret()).toEqual('bruce wayne')
})
它('如果多次初始化,则应引发异常',()=>{
const callInit=()=>initModule.init('bruce wayne')
卡利尼特()
expect(callInit).tothRower('无法重新初始化')
})
您是正确的,这里有必要内联导入其他模块,因为使用标准ES6导入无法完成模块名称空间的重置。但在上面的示例中,我使用了我认为更简单的
require()
方法

如果您使用的是typescript,并且仍然希望强烈地键入
initModule
,那么仍然可以使用标准的ES6导入来导入它以获取类型

import * as InitModule from './init'

let initModule: typeof InitModule

非常感谢!成功了。我使用动态导入是因为我想推断类型。使用require时,将丢失类型推断。然而,有一种方法可以将两者结合起来。我将更新问题以反映。