如何以编程方式指定一组测试以进行业力?

时间:2019-03-11 09:13:12

标签: angular angular-cli karma-runner angular-devkit

就是这样。我正在构建一个Angular Test Explorer。我可以使用以下业力模块查看所有测试并一起运行所有测试:

  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/",
});

不幸的是,运行测试集的方法因操作系统不同而有所不同,因为外壳本身有所不同。这给了我一些问题。

我想知道是否有人不能指出我的角度cli是如何进行业力运行并在进行常规ng测试时指定一组测试的。

我在业力存储库和支持中提出的问题没有得到任何答复,所以这就是为什么我在这里询问,我还尝试在有角度的devkit的存储库中找到那部分代码。我找到了他们在哪里做karma.server的,但是找不到我需要的部分。

1 个答案:

答案 0 :(得分:0)

解决方案是向浏览器发出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(); });
  });
}

测试正常运行 Test explorer running Angular/Karma tests with the specified method