Как использовать 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);
});
Другие вопросы по тегам