当angularjs抛出错误时,它将被捕获在try / catch中,然后异常处理程序将其记录为console.error。结果,testcafe不会使测试在任何情况下都失败,但是我们希望这被认为是失败的测试。我们尝试遵循this thread中的建议并编写了以下代码:
fixture `Getting Started`
.page `http://localhost:${port}/`;
const handleErrors = ClientFunction(() => {
console.error = msg => {throw new Error(msg)};
});
test('Test', async t => {
await handleErrors();
//visit page with error, go somewhere else, return to page
await t
.expect(Selector('body').innerText).contains('hello world')
});
控制器调用$scope.undefined()
,因此它将始终在角度代码中引发错误,但是测试仍然通过。我们将console.error = msg => {throw new Error(msg)};
直接放在我们的index.html中,并看到错误输出如下:Uncaught Error: Error: Error: Error: TypeError: $scope.undefined is not a function
。
如果我们将window.undefined();
直接添加到我们的index.html中,则TestCafe确实认为这是错误,并且测试失败。错误消息如下:Uncaught TypeError: window.undefined is not a function
。
此外,如果我们将console.error = msg => {throw new Error(msg)};
放在index.html中,则在出现angularjs错误时测试将失败。因此,看来handleErrors
无法正常工作或在该线程中宣传。
我们已经做了很多这样的测试,现在得出的结论是,角度保存了对console
的引用,因此当我在此handleErrors
中重新分配它时,它不会影响角度使用的控制台。我该如何在testcafe测试失败的情况下使角度代码出错?
对于它的价值,我们使用的是角度1.2。
答案 0 :(得分:2)
我们将其放入测试中,导致控制台错误失败:
fixture `Getting Started`
.page `http://localhost:${port}/`
.beforeEach(async t => await failOnJsErrors());
const failOnJsErrors = ClientFunction(() => {
angular.element(document.body).injector().invoke(function($log) {
$log.error = function(message) {
throw new Error(message)
};
});
});
如果您是> angularjs 1.2,则可能有不同的解决方案