как указать набор тестов к карме программно?

так дело в том. Я создаю Angular Test Explorer. Я могу увидеть все тесты и запустить их все вместе, используя модуль karma следующим образом:

  public async runWithModule(): Promise<void> {
    return new Promise<void>(resolve => {
      karma.runner.run({ port: 9876 }, (exitCode: number) => {
        global.console.log("karma run done with ", exitCode);
        resolve();
      });
    });
  }

Я также могу запустить определенный набор тестов, создающих оболочку и передающих --grep

const command = `karma run -- --grep="${tests}"`;
const exec = require("child_process").exec;
exec(command, {
  cwd: this.angularProjectRootPath + "/node_modules/karma/bin/",
});

к сожалению, метод запуска набора тестов работает по-разному в зависимости от ОС, так как оболочка отличается. Это доставляет мне некоторые проблемы.

Мне было интересно, не может ли кто-нибудь указать мне, как этот angular cli выполняет запуск кармы и указывает набор тестов, когда вы выполняете обычный тест ng.

Я спрашивал в репозитории karma и support без ответа, поэтому и спрашиваю здесь, я также пытался найти эту часть кода в репозитории angular devkit. Я нашел, где они делают karma.server, но не смог найти нужную мне часть.


person Patricio Ferraggi    schedule 11.03.2019    source источник
comment
Вы можете просто отредактировать .spec.ts тестовые файлы и выбрать тесты, которые хотите выполнить. Проверьте эту ссылку stackoverflow.com/questions/44373909/. Поэтому, если вы хотите автоматизировать это, вы можете написать скрипт узла для редактирования файлов и запуска тестов, которые вы хотите выполнить, используя метод, описанный в ссылке выше.   -  person Unsinkable Sam    schedule 11.03.2019
comment
Когда я создаю обозреватель тестов, мое приложение будет запускать тесты из проекта, над которым работает пользователь. У меня нет контроля над этими файлами, и определенно мне не нравится, что приложение, которое вы запускаете, изменяет файлы с вашего жесткого диска. Должен быть способ сделать это из кода без редактирования файлов. В настоящее время, если вы запускаете ng test, вы можете выбрать тест, чтобы запустить только его, я просто понятия не имею, как они это делают.   -  person Patricio Ferraggi    schedule 11.03.2019


Ответы (1)


Решение состоит в том, чтобы сделать http-запрос к браузеру по пути /run. это вызовет запуск кармы, вы также можете указать набор тестов, используя --grep=, как в командной строке

public async runTests(tests: any): Promise<void> {
  const karmaRunParameters = this.createKarmaRunConfiguration(tests);

  await this.runWithConfig(karmaRunParameters.config);
}

private createKarmaRunConfiguration(tests: any) {
  // if testName is undefined, reset jasmine.getEnv().specFilter function
  // otherwise, last specified specFilter will be used

  if (tests[0] === "root" || tests[0] === undefined) {
    tests = "";
  }
  const serverPort = 9876;
  const urlRoot = "/run";
  const config = {
    port: serverPort,
    refresh: true,
    urlRoot,
    hostname: "localhost",
    clientArgs: [] as string[],
  };
  config.clientArgs = [`--grep=${tests}`];
  return { config, tests };
}

private runWithConfig(config: any): Promise<void> {
  return new Promise<void>(resolve => {
    const options = {
      hostname: config.hostname,
      path: config.urlRoot,
      port: config.port,
      method: "POST",
      headers: {
        "Content-Type": "application/json",
      },
    };

    const http = require("http");

    const request = http.request(options);

    request.on("error", (e: any) => {
      if (e.code === "ECONNREFUSED") {
        global.console.error("There is no server listening on port %d", options.port);
      }
    });

    request.end(JSON.stringify({
      args: config.clientArgs,
      removedFiles: config.removedFiles,
      changedFiles: config.changedFiles,
      addedFiles: config.addedFiles,
      refresh: config.refresh,
    }));

    request.on("close",() =>{ resolve(); });
  });
}

Тест выполняется правильно Проводник тестов запускает тесты Angular/Karma указанным методом

person Patricio Ferraggi    schedule 13.03.2019