Запустить тест кармы из JS без файла конфигурации

Можно ли как-нибудь запустить карму, не задавая статический конфигурационный файл, а предоставив ему объект конфигурации?

Идеальный сценарий будет выглядеть примерно так:

const karmaConfig = {...};

gulp.task('test', function (done) {
  new Server({
    config: karmaConfig,
    singleRun: true
  }, done).start();
});

Есть ли способ сделать это?

Причина этого в том, что я хочу, чтобы разные тестовые прогоны рассматривали разные файлы, которые я указываю в общем файле конфигурации где-то еще.

1 ответ

Решение

Я нашел решение использовать временный файл конфигурации. Код выглядит так:

const tmp = require('tmp');
const fs = require('fs');
const gulp = require('gulp');

function createConfigFileContent(configurationObject) {
  return `
  module.exports = function karmaConfig(config) {
    const conf = ${JSON.stringify(configurationObject)};
    conf.logLevel = config.LOG_INFO;

    return config.set(conf);
  };
  `;
}

function createConfigObject(testFiles) {
  const files = testFiles.map(f => ({ pattern: f, included: true }));

  return {
    basePath: process.cwd(), // project root
    frameworks: ['jasmine'],
    files,
    exclude: [],
    preprocessors: {},
    reporters: ['progress'],
    port: 9876,
    colors: true,
    autoWatch: false,
    browsers: ['Chrome'],
    singleRun: true,
    concurrency: Infinity,
  };
}

function generateConfig(runner, testFiles) {
  const config = createConfigObject(runner, testFiles);

  return createConfigFileContent(config);
}


gulp.task('karma', done => {
  // Create temporary configuration file
  const config = tmp.fileSync();

  // Populate it with config to run our files
  fs.writeFileSync(config.name, generateConfig(FILESARRAY));

  // Run karma
  return new KarmaServer({
      configFile: config.name,
      singleRun: true,
    },
    function cleanUp() {
      // Erase temporary config and finish task
      config.removeCallback();
      done();
    }).start();
});
Другие вопросы по тегам