如何使用jest/sinon等在javascript中模拟(更改值)全局变量?

如何使用jest/sinon等在javascript中模拟(更改值)全局变量?,javascript,typescript,unit-testing,jestjs,sinon,Javascript,Typescript,Unit Testing,Jestjs,Sinon,我正在为ts文件编写测试用例,该文件包含如下全局变量: let cachedSecret: any; const find = () => { if(cachedSecret){ //return something } else { //return something else } } 我需要找到一种方法,以便对于其中一个测试用例,我可以将cachedSecret的值模拟为某个字符串,而在另一个测试用例中,它的值应该为null 我正在使用j

我正在为ts文件编写测试用例,该文件包含如下全局变量:

let cachedSecret: any;

const find = () => {
   if(cachedSecret){
     //return something
   } else {
       //return something else
   }
}
我需要找到一种方法,以便对于其中一个测试用例,我可以将cachedSecret的值模拟为某个字符串,而在另一个测试用例中,它的值应该为null

我正在使用jest和sinon,但我还没有找到一种方法来做到这一点

谢谢

您可以使用package模拟模块范围中定义的变量

例如

index.ts

让cachedSecret:任意;
常量查找=()=>{
log('cachedSecret:',cachedSecret,cachedSecret的类型);
如果(缓存秘密){
返回“某物”;
}否则{
返回“其他东西”;
}
};
导出{find};
index.test.ts

从“重新布线”导入重新布线;
描述('63955435',()=>{
它('应该返回某物',()=>{
常数模=重新布线('./');
const revert=mod.\uuuuu set\uuuuu('cachedSecret',true);
const actual=mod.find();
期望(实际)。toEqual(“某物”);
回复();
});
它('应该返回其他东西',()=>{
const mod=require('./');
const actual=mod.find();
期望(实际)。toEqual(“其他东西”);
});
});
单元测试结果和覆盖率报告:

通过src/stackoverflow/63955435/index.test.ts
63955435
✓ 应该返回一些内容(202ms)
✓ 应该返回其他内容(40毫秒)
cachedSecret:真布尔值
console.log src/stackoverflow/63955435/index.ts:4
cachedSecret:未定义未定义
测试套件:1个通过,共1个
测试:2次通过,共2次
快照:共0个
时间:4.4s,估计11s
npm脚本

“测试:重新布线”:“ts节点-O'{\'module\':\'commonjs\'}'节点\u modules/jest/bin/jest.js”,

源代码:

我想你应该首先嘲笑这个类。代码缺乏上下文,有没有真正的理由认为它是全局的?在模块中求值时,
让cachedSecret
声明局部变量而不是全局变量。不,没有办法用玩笑来访问它。将需要模拟的所有内容放到可以用jest.mock模拟的模块中。