我们确实在代码库中使用console.assert
作为防御性编程的一部分,以便检查一些复杂的代码部分,并注释关于代码中正在做什么的假设/它计算的值/假设等。
的例子:
function calculateSomething(a, b, c) {
// assume, we know that the calculation result below should never be negative, because other logic assures that (b - c) < a (This is just an example.)
// or that check is implemented here, but just to make sure you put that negative check before returning the value
const result = a - (b - c);
console.assert(result > 0, 'result must not be negative, but was', result);
return result;
}
console.log('result 1:', calculateSomething(1, 2, 3)); // fails
console.log('result 2:', calculateSomething(1, 3, 2)); // works
现在,我们注意到这只会在生产代码/正常代码运行时在控制台中失败/打印错误消息,但是在测试执行代码时显式地而不是。
你怎么能让console.assert
也在测试中失败?
好吧,我猜你可以只是存根,因为它可能是有用的,保留原来的callThrough
除了callFake
。只要把它放入beforeEach
中,测试就会尊重console.assert
并将其视为失败:
打印稿版本:
const realConsoleAssert = console.assert;
assertSpy = spyOn(console, 'assert').and.callFake((assertion: any, message?: string, ...optionalParams: any[]) => {
realConsoleAssert(assertion, message, ...optionalParams);
expect(assertion).toBeTruthy(`${message} ${optionalParams.concat(' ')}`);
});
JavaScript版本:
const realConsoleAssert = console.assert;
assertSpy = spyOn(console, 'assert').and.callFake((assertion, message, ...optionalParams) => {
realConsoleAssert(assertion, message, ...optionalParams);
expect(assertion).toBeTruthy(`${message} ${optionalParams.concat(' ')}`);
});
特别是optionalParams
还不理想,没有像console.assert
那样优雅地对待它,例如undefined
被转换成一个空字符串,而浏览器版本将正确打印它,但这只是一个小细节。
这可以通过自定义间谍策略来简化。