如何在 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。
我的想法是:
- 我想对客户端(反应)和服务器(node/express)进行 unit/integration 测试
- 我只想 运行
karma start
客户端和服务器测试都已测试
- 我发现预先需要以下文件非常有用,以避免在所有测试中都需要一些东西:
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);
});
我一直在尝试使用 mocha 要求选项:
mocha mytest.js --require myglobals.js
但我不知道如何从因果报应中做到这一点。思路是 运行 karma start
会自动要求 myglobals.js
.
是否可以从 karma.conf.js
或其他方式进行?
也许我没有以正确的方式使用 karma/mocha。
我的想法是:
- 我想对客户端(反应)和服务器(node/express)进行 unit/integration 测试
- 我只想 运行
karma start
客户端和服务器测试都已测试 - 我发现预先需要以下文件非常有用,以避免在所有测试中都需要一些东西:
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);
});