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

标签 javascript mocha.js

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

背景:

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

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

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

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

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

因此,我最终将其直接添加到“主测试加载程序”文件中,没有之前:

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

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

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

但这样做的缺点是我必须在每个测试文件中显式包含 testSetup.js

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

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

最佳答案

您可以像这样调用 Mocha :

mocha --require testSetup.js

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

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

关于javascript - Mocha : How Can I Structure Things to Run Setup Code *Before* App Code Loads?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49833762/

相关文章:

unit-testing - 如何对 React-Redux 连接的组件进行单元测试?

javascript - 根据标题选择行

javascript - 如何控制绘制为div背景的图像分辨率

node.js - 为什么 Mocha 说我的测试通过了,而它不应该通过?

javascript - 如何使用 Mocha 在 Karma 中加载用于 Javascript 单元测试的 HTML 固定装置?

javascript - 在 mocha-jsdom 中使用 jQuery 时如何修复 "ReferenceError: $ is not defined"?

javascript - 从主文档中的 JavaScript 获取 IFrame 的文档

javascript - 将 ISO 8601 时间格式化为 Laravel View

javascript - 更改输入类型 ="file"的 innerHTML 会导致未捕获类型错误?

javascript - Node.js集成测试+数据库