Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/418.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在Jest中更改全局值后如何重新导入函数/变量_Javascript_Jestjs - Fatal编程技术网

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