当angularjs引发错误时,如何使TestCafe测试失败?

时间:2018-08-09 17:14:16

标签: javascript angularjs monkeypatching testcafe angularjs-1.2

当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。

1 个答案:

答案 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,则可能有不同的解决方案