Javascript 如何在karma/mocha测试套件中模拟窗口对象属性?
我正在使用karma和mocha以及React的TestUtils来测试React应用程序。我正在测试的组件之一导入具有以下导出的模块:Javascript 如何在karma/mocha测试套件中模拟窗口对象属性?,javascript,unit-testing,reactjs,webpack,karma-mocha,Javascript,Unit Testing,Reactjs,Webpack,Karma Mocha,我正在使用karma和mocha以及React的TestUtils来测试React应用程序。我正在测试的组件之一导入具有以下导出的模块: export const OPTIONS=窗口 在我的测试中,我在karma中将组件渲染到虚拟chrome浏览器中。我是通过以下途径做到这一点的: let tree=TestUtils.renderIntoDocument() “Component”的呈现函数引用了类似于OPTIONS.someOption的内容,当上述测试运行时,它会爆炸并说无法读取未定义的
export const OPTIONS=窗口代码>
在我的测试中,我在karma中将组件渲染到虚拟chrome浏览器中。我是通过以下途径做到这一点的:
let tree=TestUtils.renderIntoDocument()代码>
“Component”的呈现函数引用了类似于OPTIONS.someOption的内容,当上述测试运行时,它会爆炸并说无法读取未定义的属性“someOption”。
我尝试在before()
函数中“模拟”\uuuuuu OPTIONS\uuuuuuu
变量(在测试运行之前设置它的值),但即使在注销它并看到它实际上已被设置之后,它在我的组件模块中的值仍然没有定义。因此,webpack似乎在我的任何测试脚本实际运行之前绑定了模块,因此它总是未定义的
有没有办法将窗口设置为一个值,就好像它包含在窗口中一样代码>在我的页面顶部,并因此在我的组件模块中正确导入值
我不想解释为什么要将变量附加到窗口对象,因为在本例中,这是我无法避免的事情……这是Salesforce特有的原因。如果我可以完全避免使用该变量,我会。尝试在每次之前在中使用\uuuuu选项\uuuuu
将窗口对象添加到全局:
beforeEach(function() {
global.window = {
__OPTIONS__: {}
};
});
我尝试了global
路线,但是没有用……因为karma正在启动Chrome浏览器,所以窗口已经被定义好了。在不同地区进行了大量的日志记录之后,我确认了操作顺序是1。模块被捆绑在一起。测试脚本已运行。我在组件的import语句下面直接添加了一个日志,然后在测试脚本的第一行添加了一个日志,导入之后的日志总是首先报告未定义
接下来,我备份了一个步骤并查看了tests.webpack.js
,它位于我的karma配置文件中的文件和预处理器(webpack)中。我在var context=require.context('./src',true,/-test\.jsx?$/)行上方添加了变量声明代码>和context.keys().forEach(上下文)代码>现在可以正常工作了