我刚刚修复了Angular应用程序的单元/组件测试中的几个警告,这些测试使用ng test
(与Karma/Jastine一起(运行。
这个过程可能非常耗时,因为发现哪个测试用例实际上导致了警告并不总是显而易见的。
现在我没有任何警告了,我想知道是否有一种方法可以让ng test
在出现任何警告时自动失败。
在test.ts
或初始化测试的地方可能会出现类似的情况。
console.warn = (message) => throw new Error(message);
我不知道我是否会建议这样做,因为警告只是警告,但错误就是错误,应该立即处理。你把它放在哪里只是为了测试也可能很棘手。
在工作区根目录中定义一个额外的文件,例如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')
]
// ...
};
};
一个简单易行的修复方法是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));
在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:nn${output.join('n')}`);
};
console.warn = function (message?: any, ...optionalParams: any[]): void {
console.error(message, ...optionalParams);
};
文件中的位置?就在因果报应.start((之后的底部?