AngularJS 测试 - 测试 Promise 回调中的逻辑

AngularJS Testing - Testing Out Logic in Promise Callback

我的控制器中有以下功能:

$scope.submitNote = function(){
    myService.addNote($scope.note).then(function(data){
        if(data.success === true){
            $scope.note = null;
        }
        else{
            // API call failed
        }
    }, function(){
        // Promise call failed
    });
};

我设置我的测试环境:

// Mock out fake service
beforeEach(function(){
    myService = {
        addNote: function(){
            deferred = q.defer();
            deferred.resolve({
                success: true
            });
            return deferred.promise;
        }
    };
    spyOn(myService, 'addNote').and.callThrough();
});

// Assign controller scope
beforeEach(inject(function($controller, $rootScope, $q){
    q = $q;
    scope = $rootScope.$new();
    $controller('myController', {
        $scope: scope,
        myService: myService
    });
}));

然后测试我的 submitNote() 函数:

describe('submitNote Test', function(){
    it('should set scope.note to null after successful service call', function(){
        scope.submitNote();
        expect(myService.addNote).toHaveBeenCalled();
        expect(scope.note).toBe(null);
    });
});

第一个 expect 通过,但第二个 expect 没有通过。我的 submitNote() 函数的 then() 回调似乎没有在测试中被调用。

如何确保调用原始函数中的 promise 回调?

为了让您可以更好地控制 ngMock 模块以提供更清晰的测试,扩展了各种核心服务,以便可以以同步方式检查和控制它们。

Promise 回调在摘要循环期间执行,在您的测试环境中您需要手动启动。

例如:

describe('submitNote Test', function () {
    it('should set scope.note to null after successful service call', function () {

        scope.submitNote();
        scope.$digest();

        expect(myService.addNote).toHaveBeenCalled();
        expect(scope.note).toBe(null);
    });
});