如何以编程方式为业力指定一组测试?
how to specify a set of tests to karma programmatically?
事情是这样的。我正在构建一个 Angular 测试资源管理器。通过使用 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();
});
});
}
我还能够 运行 特定的测试集创建 shell 并通过 --grep
const command = `karma run -- --grep="${tests}"`;
const exec = require("child_process").exec;
exec(command, {
cwd: this.angularProjectRootPath + "/node_modules/karma/bin/",
});
不幸的是,运行一组测试的方法因 OS 而不同,因为 shell 其不同。这给我带来了一些问题。
我想知道是否有人能指出我 angular cli 如何执行业力 运行 并在您进行常规 ng 测试时指定一组测试。
我在 karma 存储库和支持中询问但没有任何答案,所以这就是我在这里问的原因,我还尝试在 angular devkit 的存储库中找到那部分代码。我找到了他们在哪里做 karma.server 但找不到我需要的部分。
解决方案是向浏览器发出一个 http 请求到路径 /运行。这将触发 karma 运行,您还可以像在命令行
上那样使用 --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
事情是这样的。我正在构建一个 Angular 测试资源管理器。通过使用 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();
});
});
}
我还能够 运行 特定的测试集创建 shell 并通过 --grep
const command = `karma run -- --grep="${tests}"`;
const exec = require("child_process").exec;
exec(command, {
cwd: this.angularProjectRootPath + "/node_modules/karma/bin/",
});
不幸的是,运行一组测试的方法因 OS 而不同,因为 shell 其不同。这给我带来了一些问题。
我想知道是否有人能指出我 angular cli 如何执行业力 运行 并在您进行常规 ng 测试时指定一组测试。
我在 karma 存储库和支持中询问但没有任何答案,所以这就是我在这里问的原因,我还尝试在 angular devkit 的存储库中找到那部分代码。我找到了他们在哪里做 karma.server 但找不到我需要的部分。
解决方案是向浏览器发出一个 http 请求到路径 /运行。这将触发 karma 运行,您还可以像在命令行
上那样使用 --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