Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/363.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 如果ES6导入的模块是只读的,如何模拟它们?_Javascript_Unit Testing_Import_Ecmascript 6 - Fatal编程技术网

Javascript 如果ES6导入的模块是只读的,如何模拟它们?

Javascript 如果ES6导入的模块是只读的,如何模拟它们?,javascript,unit-testing,import,ecmascript-6,Javascript,Unit Testing,Import,Ecmascript 6,由于导入ES6模块会为您提供该模块的只读视图,因此模拟它会产生错误“x”是只读的。这阻止了我通过破坏依赖关系来隔离测试中的代码。我不知道该怎么解决这个问题 *我可能会抛出一个Plunker,但我无法让它识别import语句,而且JSFIDLE似乎不允许其他文件,这将用于导出的模块。我的解决方案是更改导出方式。如果我导出一个属性对象,而不是单个属性本身,我不会得到错误。这似乎是因为Object.freeze只有一层深,所以导出的对象是冻结的,而不是子对象 从“/index”导入{ua} /ind

由于导入ES6模块会为您提供该模块的只读视图,因此模拟它会产生错误
“x”是只读的
。这阻止了我通过破坏依赖关系来隔离测试中的代码。我不知道该怎么解决这个问题


*我可能会抛出一个Plunker,但我无法让它识别
import
语句,而且JSFIDLE似乎不允许其他文件,这将用于导出的模块。

我的解决方案是更改导出方式。如果我导出一个属性对象,而不是单个属性本身,我不会得到错误。这似乎是因为Object.freeze只有一层深,所以导出的对象是冻结的,而不是子对象

从“/index”导入{ua}

/index.js
导出一个命名对象,其中包含我要覆盖的道具:

导出常量ua={
删除用户,
负荷用户

};如果您正在使用sinon,我的建议是停止使用它。他们不支持模仿只读模块,并且在这个话题上非常激进

另一方面,使用jest,您可以轻松模拟ES6只读模块,如下所示:

const myMockedModule = {
   ...jest.requireActual('my-es6-readonly-module'),
   theFunctionIWantToMock: jest.fn(),
}
jest.mock('my-es6-readonly-module', () => myMockedModule);
您需要将其作为规范的第一行。使用这种方法,您可以模拟来自任何模块的任何直接导出项,即使它是只读的,因为jest截取require方法。
这对于mocha来说也不太可行,因为mocha在同一个过程中加载所有测试,而其他一些测试套件可能会直接或间接加载您想要模拟的模块,这会破坏您的测试。玩笑是一种方法,因为它在分离的过程中装载每一个规格,使一个规格不干扰另一个,所以这种嘲弄的方法变得可行。

你是否考虑注入你的污点?这样,您就不必嘲笑导入。如果不是,那么已经有了一个答案: