如何在 Karma 中使用 Mocha require 选项

How to use Mocha require option in Karma

我一直在尝试使用 mocha 要求选项:

mocha mytest.js --require myglobals.js

但我不知道如何从因果报应中做到这一点。思路是 运行 karma start 会自动要求 myglobals.js.

是否可以从 karma.conf.js 或其他方式进行?

也许我没有以正确的方式使用 karma/mocha。

我的想法是:

myglobals.js:

const chai = require('chai');

// Load Chai assertions
global.expect = chai.expect;
global.assert = chai.assert;
chai.should();

// Load Sinon
global.sinon = require('sinon');

// Initialize Chai plugins
chai.use(require('sinon-chai'));
chai.use(require('chai-as-promised'));
chai.use(require('chai-things'));

对于服务器端,我使用以下命令使其工作:

mocha mytest.js --require myglobals.js

但是,我还是想将其 运行ning 保留在 npm run test (调用 karma start 下,而不是创建另一个 npm run test:server命令。

此外,我想在客户端上做同样的事情。我在那里使用 webpack 作为预处理器。

有什么想法可以实现吗?还是我走错了路?

简答

浏览器中的 Mocha 不支持 --require 选项的等效项,但您不需要它。您可以在测试之前加载您需要的任何内容,列出您要在测试文件前面的 files 中加载的文件。或者,如果您使用像 RequireJS 这样的加载器,请编写一个 test-main.js 来加载您将首先使用 --require 加载的模块,然后加载您的测试文件。

长答案

如果您查看 Mocha 的代码,您会发现唯一使用 --require 的地方是 bin/_mocha file. This option is not passed further into the Mocha code but is immediately used to load the requested modules:

requires.forEach(function(mod) {
  require(mod);
});

当你在浏览器中 运行 Mocha 时,这段代码的 none 是 运行,如果你查看其余的 Mocha 代码,你将找不到类似的其他任何地方的设施。为什么?

因为它没有任何用处。 --require 选项在命令行中非常有用。没有它,在 Mocha 加载测试文件之前加载模块的唯一方法是编写自定义代码来启动 Mocha,或者在每个测试文件的开头放置必要的 require 调用。

在浏览器中,如果您不使用模块加载器,您可以只加载要使用 --require 加载的代码,方法是将加载它们的 script 元素放在script 个加载测试的元素。在 Karma 中,这意味着将这些文件放在 karma.conf.js 中的 files 列表的前面。或者,如果你使用 RequireJS,例如,你写 test-main.js 以便加载分两个阶段完成:一个加载你要通过 --require 在命令行上加载的模块,第二个加载您的测试文件。它可能是这样的:

const allTestFiles = [];
const TEST_REGEXP = /test\/test.*\.js$/i;

Object.keys(window.__karma__.files).forEach((file) => {
  if (TEST_REGEXP.test(file)) {
    const normalizedTestModule = file.replace(/^\/base\/|\.js$/g, "");
    allTestFiles.push(normalizedTestModule);
  }
});

require.config({
  baseUrl: "/base",
  paths: {
     ...
  },
});

// This guarantees that "a", "b", "c" loads before any other module
require(["a", "b", "c", ...], () => {
  require(allTestFiles, window.__karma__.start);
});