Javascript 在Jest中更改全局值后如何重新导入函数/变量
这是一个我试图做的非常做作的例子。我有一个不可变的Javascript 在Jest中更改全局值后如何重新导入函数/变量,javascript,jestjs,Javascript,Jestjs,这是一个我试图做的非常做作的例子。我有一个不可变的值,它从窗口获取一个东西,并且值在函数示例中使用 file.js 从“lodash”导入; 常量值=551;.get(窗口'thing',null); 导出常量示例=()=>值; 我想在不同的情况下测试示例:当thing设置为foo时,当thing设置为bar时,当thing根本没有设置时,等等 我可以在jest测试文件中开始设置: file.spec.js 从'/file.js'导入{example}; 描述('示例',()=>{ 它('当w
值
,它从窗口获取一个东西
,并且值
在函数示例
中使用
file.js
从“lodash”导入;
常量值=551;.get(窗口'thing',null);
导出常量示例=()=>值;
我想在不同的情况下测试示例
:当thing
设置为foo
时,当thing
设置为bar
时,当thing根本没有设置时,等等
我可以在jest测试文件中开始设置:
file.spec.js
从'/file.js'导入{example};
描述('示例',()=>{
它('当window.thing等于foo时应返回foo',()=>{
window.thing='foo';
const result=example();
期望(结果)toBe('foo');
});
});
这看起来是可行的,但事实并非如此,因为我认为当Jest设置此测试套件时,它会在我将测试中的window.thing设置为'foo'
之前导入模块file.js
这是有道理的,我可以通过在我的配置中将thing
声明为预设全局来解决这个问题:
jest.config.js
。。。
全球:{
...
事情:“福”,
...
},
...
现在应该可以通过上面的测试了,但是不能灵活地更新window.thing
。看起来我必须将window.thing
设置为一个不同的值,然后重置模块,但我认为如果全局变量存储在配置中,这将不起作用。如果我尝试添加另一个具有不同条件的测试:
it('window.thing等于bar时应返回bar',()=>{
window.thing='bar';
const result=example();
期望(结果)。托比('bar');
});
这将失败,看起来我无法在这个测试套件中使用不同的值测试东西
有什么办法可以让它工作吗?您不能使用普通的import
。您需要设置window.thing
,然后执行require()
(或import()
表达式),然后运行测试,然后清除模块缓存,将window.thing
设置为其他内容并重复。另一种选择是:不要这样编写代码。不要使用需要更改的全局const
ants。至少将示例功能放在一个单独的、单元可测试的模块中,然后让file.js使用import makeExample from…;export const example=makeExample(窗口?.thing??空)代码>谢谢您的建议@Bergi。在一个单元测试开始时,我一直在尝试将其与动态导入一起使用,但还没有弄明白这一点。还在调查。我也可能会转而使用const-example=window?.thing??null
而不是。.get