如何让测试在控制台上失败.与Jasmine断言失败?



我们确实在代码库中使用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被转换成一个空字符串,而浏览器版本将正确打印它,但这只是一个小细节。

这可以通过自定义间谍策略来简化。

相关内容

  • 没有找到相关文章

最新更新