Javascript 摩卡:在加载应用程序代码之前,我如何构建运行安装程序代码的结构?
TLDR:是否有办法在加载应用程序代码之前(而不仅仅是在测试代码运行之前)运行Mocha测试设置代码,而不必在每个测试文件中导入该设置代码 背景: 我有一个客户端应用程序,我正试图用Mocha进行测试。我在该应用程序中的一个模块执行以下操作:Javascript 摩卡:在加载应用程序代码之前,我如何构建运行安装程序代码的结构?,javascript,mocha.js,Javascript,Mocha.js,TLDR:是否有办法在加载应用程序代码之前(而不仅仅是在测试代码运行之前)运行Mocha测试设置代码,而不必在每个测试文件中导入该设置代码 背景: 我有一个客户端应用程序,我正试图用Mocha进行测试。我在该应用程序中的一个模块执行以下操作: // foo.js const initialReduxState = { currentLocation: window.location }; 问题是,窗口在测试环境中不存在,因此我必须为我的测试模拟一个窗口: // testSetup.js bef
// 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
命令行选项来requiretestSetup
(无需在每个测试文件中都要求它)。。。但事实证明,以这种方式加载的文件不会得到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版本。