Mocha:如何在应用程序代码加载之前构建 运行 设置代码?

Mocha: How Can I Structure Things to Run Setup Code *Before* App Code Loads?

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

背景:

我有一个客户端应用程序正在尝试使用 Mocha 进行测试。我在那个应用程序中的一个模块做了一些事情:

// foo.js
const initialReduxState = { currentLocation: window.location };

问题是,window在测试环境中不存在,所以我必须模拟一个来进行测试:

// testSetup.js
before(() => {
    const { window } = new JSDOM(`...`);
    global.window = window;
});

但是如果我真的像刚才那样使用before,它不会起作用,因为testSetup代码会加载,然后应用程序代码(需要window)会加载,然后测试设置中的 before 将 运行(为时已晚)。

所以我最终将它直接添加到 "master test loader" 文件中,没有 before:

// masterTestLoader.js
const { window } = new JSDOM(`...`);
beforeEach(() => {
    global.window = window;
});
import 'fooTest';

但如果我这样做,我只能 运行 整个套件;我无法 运行 单独的测试文件。所以我又回到了 testSetup.js 文件,删除了 before,并开始在我的测试中导入 testSetup.js

// fooTest.js
import 'testSetup'; run this first to create window
import 'foo'; // uses window
testSomething();

但缺点是我必须在每个测试文件中明确包含 testSetup.js

我还尝试使用 mocha --require 命令行选项来要求 testSetup(不必在每个测试文件中要求它)...但事实证明文件是以这种方式加载的不要获取 Mocha 全局变量(例如 beforeEach)。

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

您可以像这样调用 mocha:

mocha --require testSetup.js

其中 testSetup.js 包含您希望 运行 在实际测试加载之前成为的所有内容。

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