【问题标题】:Mocha: How Can I Structure Things to Run Setup Code *Before* App Code Loads?Mocha:我如何构造事物以运行设置代码*在*应用程序代码加载之前?
【发布时间】: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


【解决方案1】:

你可以像这样调用 mocha:

mocha --require testSetup.js

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

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

【讨论】:

  • 谢谢,但这种方法的问题是 --require 不加载 Mocha 全局变量,所以我不能在 @ 内使用 beforeEach(在每次测试之前刷新模拟 DOM) 987654328@ 如果我这样做。
  • 顺便说一句,我还发现了--file 选项,这看起来很有希望,但显然它不适用于--recursive 选项(我也在使用)。
  • 其实好像更新我的摩卡版本就修复了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-20
  • 1970-01-01
  • 2019-01-24
  • 1970-01-01
相关资源
最近更新 更多