Как использовать Mocha require option в Карме
Я пытался использовать опцию mocha require:
mocha mytest.js --require myglobals.js
Но я не знаю, как это сделать из кармы. Идея состоит в том, чтобы бежать karma start
и это автоматически потребует myglobals.js
,
Возможно ли это сделать изнутри karma.conf.js
или как-то еще?
Может быть, я не правильно использую карму / мокко.
Моя идея такова:
- Я хочу иметь модульные / интеграционные тесты как для клиента (реагировать), так и для сервера (узел / экспресс)
- Я хочу просто бежать
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
Но все же я хотел, чтобы он работал под npm run test
(который вызывает karma start
) вместо создания другого npm run test:server
команда.
Кроме того, я хотел сделать то же самое на клиенте. Я использую Webpack там в качестве препроцессора.
Есть идеи, если это возможно сделать? А может я не в том направлении?
1 ответ
Короткий ответ
Мокко в браузере не поддерживает эквивалент --require
вариант, но вам это не нужно. Вы можете просто загрузить все, что вам нужно, перед вашими тестами, перечисляя файлы, которые вы хотите загрузить в files
перед вашими тестовыми файлами. Или, если вы используете загрузчик типа RequireJS, напишите test-main.js
который загружает модули, которые вы бы загружали --require
сначала, а затем загрузите ваши тестовые файлы.
Длинный ответ
Если вы посмотрите на код Мокко, вы увидите, что единственное место --require
используется в bin/_mocha
файл. Эта опция не передается дальше в код Mocha, но сразу используется для загрузки запрошенных модулей:
requires.forEach(function(mod) {
require(mod);
});
Когда вы запускаете Mocha в браузере, ни один из этих кодов не запускается, и если вы посмотрите на остальную часть кода Mocha, вы не найдете подобного средства в другом месте. Зачем?
Потому что это не будет служить цели. --require
опция очень полезна в командной строке. Без этого единственный способ загрузить модули перед загрузкой Mocha тестовых файлов - это либо написать собственный код для запуска Mocha, либо поставить необходимые require
вызовы в начале каждого тестового файла.
В браузере, если вы не используете загрузчик модулей, вы можете просто загрузить код, который вы загружаете, используя --require
поставив script
элементы, которые загружают их перед script
элементы, которые загружают ваши тесты. В Карме это означает помещение этих файлов ранее в список files
у вас в вашем karma.conf.js
, Или, если вы используете 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);
});