如何单元测试/模拟$ timeout调用?

GC_*_*GC_ 4 unit-testing mocking jasmine angularjs spyon

我如何模拟超时调用?

$scope.submitRequest = function () {

    var formData = getData();

    $scope.form = JSON.parse(formData);

    $timeout(function () {
        $('#submitForm').click();            
    }, 2000);

};
Run Code Online (Sandbox Code Playgroud)

我希望看到使用正确的函数调用超时.

我想要一个模拟$ timeout的spyon函数的例子.

spyOn(someObject,'$timeout')
Run Code Online (Sandbox Code Playgroud)

Fra*_*jak 5

首先,DOM操作应该只在指令中执行.此外,最好使用angular.element(...),而不是$(...).最后,为此,您可以将元素的单击处理程序暴露给作用域,监视它,并检查是否已调用该处理程序:

$timeout.flush(2000);
$timeout.verifyNoPendingTasks();
expect(scope.myClickHandler).toHaveBeenCalled();
Run Code Online (Sandbox Code Playgroud)

编辑:

由于这是一个表单,并且没有ng-click处理程序,您可以使用ng-submit处理程序,或者为表单添加名称并执行:

$timeout.flush(2000);
$timeout.verifyNoPendingTasks();
expect(scope.formName.$submitted).toBeTruthy();
Run Code Online (Sandbox Code Playgroud)