【发布时间】:2018-09-24 19:16:34
【问题描述】:
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 文件,删除了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 测试的某些代码不仅在测试代码之前运行,而且在应用程序代码之前运行……而不必在每个测试文件中显式导入该代码?
【问题讨论】:
-
您可以在加载所有其他内容之前创建一次窗口对象,但这意味着每个测试都使用相同的窗口对象。也许您可以在加载所有其他内容之前创建一次,然后将其重新创建为每个测试的
after。 -
是的,这绝对是我的目标。我模糊的地方是“在实践中,我如何在我的应用程序代码加载之前实际做到这一点(无需在每个测试文件的顶部进行设置)?”
标签: javascript mocha.js