Javascript 摩卡:在加载应用程序代码之前,我如何构建运行安装程序代码的结构?

Javascript 摩卡:在加载应用程序代码之前,我如何构建运行安装程序代码的结构?,javascript,mocha.js,Javascript,Mocha.js,TLDR:是否有办法在加载应用程序代码之前(而不仅仅是在测试代码运行之前)运行Mocha测试设置代码,而不必在每个测试文件中导入该设置代码 背景: 我有一个客户端应用程序,我正试图用Mocha进行测试。我在该应用程序中的一个模块执行以下操作: // foo.js const initialReduxState = { currentLocation: window.location }; 问题是,窗口在测试环境中不存在,因此我必须为我的测试模拟一个窗口: // testSetup.js bef

TLDR:是否有办法在加载应用程序代码之前(而不仅仅是在测试代码运行之前)运行Mocha测试设置代码,而不必在每个测试文件中导入该设置代码

背景:

我有一个客户端应用程序,我正试图用Mocha进行测试。我在该应用程序中的一个模块执行以下操作:

// foo.js
const initialReduxState = { currentLocation: window.location };
问题是,
窗口
在测试环境中不存在,因此我必须为我的测试模拟一个窗口:

// testSetup.js
before(() => {
    const { window } = new JSDOM(`...`);
    global.window = window;
});
// fooTest.js
import 'testSetup'; run this first to create window
import 'foo'; // uses window
testSomething();
但是如果我真的像刚才那样使用
之前的
,它将不起作用,因为testSetup代码将加载,然后应用程序代码(需要
窗口
)将加载,然后测试设置中的
之前的
将运行(太晚了)

因此,我将其直接添加到“主测试加载程序”文件中,而不使用before:

// masterTestLoader.js
const { window } = new JSDOM(`...`);
beforeEach(() => {
    global.window = window;
});
import 'fooTest';
但如果我这样做,我只能管理整个套房;我无法运行单个测试文件。因此,我转而使用
testSetup.js
文件,删除了
之前的
,并开始在测试中导入
testSetup.js

// testSetup.js
before(() => {
    const { window } = new JSDOM(`...`);
    global.window = window;
});
// fooTest.js
import 'testSetup'; run this first to create window
import 'foo'; // uses window
testSomething();
但这样做的缺点是,我必须在每个测试文件中显式地包含
testSetup.js

我还尝试使用mocha
--require
命令行选项来require
testSetup
(无需在每个测试文件中都要求它)。。。但事实证明,以这种方式加载的文件不会得到Mocha globals(比如每次加载之前的


我的问题是,有什么办法可以两全其美?换句话说,有没有办法确保Mocha测试的某些代码不仅在测试代码之前运行,而且在应用程序代码之前运行。。。无需在每个测试文件中显式导入该代码?

您可以这样调用mocha:

mocha --require testSetup.js
其中
testSetup.js
包含在实际测试加载之前要运行的所有内容


或者,您可以在您的
包.json
旁边创建一个
mocha.opts
文件,其中包含
--require testSetup.js
,该文件将在每次测试运行时自动加载。

您可以在加载所有其他内容之前创建一次窗口对象,但这意味着每个测试都使用相同的窗口对象。也许你可以在加载所有其他东西之前创建一次,然后在每次测试之后重新创建它。是的,这绝对是我的目标。我不清楚的是“实际上,在加载应用程序代码之前(不需要在每个测试文件的顶部进行设置),我实际上如何做到这一点?”谢谢,但这种方法的问题是,
--require
不会加载Mocha globals,所以我不能在每次加载之前使用
(在每次测试之前刷新模拟DOM)在
testSetup.js
中,如果我这样做了。顺便说一句,我还找到了
--file
选项,这似乎很有希望,但显然它与
--recursive
选项(我也在使用)不起作用。实际上,它看起来像是更新了我的Mocha版本。