【问题标题】:How to make ng test to fail on warnings如何使 ng 测试因警告而失败
【发布时间】:2020-06-19 08:44:11
【问题描述】:
我刚刚在我的 Angular 应用程序的单元/组件测试中修复了几个警告,这些警告使用 ng test(使用 Karma/Jasmine)运行。
此过程可能非常耗时,因为并不总是很明显地发现实际上是哪个测试用例导致了警告。
所以现在我没有任何警告,我想知道是否有办法让ng test 在出现任何警告时自动失败。
【问题讨论】:
标签:
angular
jasmine
karma-jasmine
karma-runner
angular-test
【解决方案1】:
在test.ts 或初始化测试的某个地方可能会出现这样的情况。
console.warn = (message) => throw new Error(message);
我不知道我是否会推荐这个,因为警告就是警告,但错误就是错误,应该立即处理。仅将其放置在测试的位置也很棘手。
【解决方案2】:
一个简单易行的修复方法是在您的 test.ts 文件中添加一个 beforeAll 块。它用错误函数替换所有控制台方法。
这样,如果您致电 console.log,测试将失败,您将知道哪些测试。
如果您仍想在正在测试的单元中使用console.log,那么您可以监视它。但由于共享全局状态,这也很糟糕。
这是一个例子:
const errorFn = () => { throw new Error('No console logs!'); };
beforeAll(() => Object.keys(console).forEach((fn: string) => (console as any)[fn] = errorFn));
【解决方案3】:
在您的工作区根目录中定义一个额外的文件 - 例如名为 karma.globals.js,如下所示:
// add globals for karma test runs
console.warn = (message) => { throw new Error(message); };
现在将它包含在你的根karma.conf.js 中,例如:
const { join } = require('path');
module.exports = () => {
return {
// ...
files: [
join(__dirname, 'karma.globals.js')
]
// ...
};
};
【解决方案4】:
在test.ts 中,我像猴子一样对其进行了修补,以便在出现错误时还打印堆栈跟踪:
console.error = function (message?: any, ...optionalParams: any[]): void {
const messages = [message, ...optionalParams];
const output = messages?.map(x => x.hasOwnProperty('stack') ? x.stack : x);
fail(`Test contained console error:\n\n${output.join('\n')}`);
};
console.warn = function (message?: any, ...optionalParams: any[]): void {
console.error(message, ...optionalParams);
};