繁体   English   中英

茉莉测试诺言角

[英]Testing promise angular with jasmine

我正在尝试检查是否已调用带有承诺的方法

这是我的控制器

app.controller('StoresListController', function ($scope, StoresService) {

    $scope.getStores = function () {
        StoresService.getStores().then(function (data) {
            $scope.stores = data.data;
        });
    };
    $scope.getStores();

    $scope.deleteStore = function (id) {
        StoresService.deleteStore(id).then(function () {
            $scope.getStores();
        });

    };
})

和我的测试

beforeEach(inject(function($rootScope, $controller, $q) {
        rootScope = $rootScope;
        scope = $rootScope.$new();
        controller = $controller;

        serviceMock = {
            getStores: function(){
                // mock promise
                var deferred = $q.defer();
                deferred.resolve({data : 'foo'});
                return deferred.promise;
            },
            deleteStore : function(){
                var deferred = $q.defer();
                deferred.resolve({data : 'foo'});
                return deferred.promise;
            }
        }
        spyOn(serviceMock,'getStores').and.callThrough();
        controller("StoresListController", {$scope: scope, StoresService: serviceMock});      

    }));  

    it('should call scope.getStores', function(){
        scope.$digest();
        expect(scope.getStores).toHaveBeenCalled()
    });
    it('should call scope.getStores afeter scope.deleteStore', function(){
        scope.deleteStore(1)
        scope.$digest();
        expect(scope.getStores.call.count).toBe(2)
    });

});

我得到了错误:期望有一个间谍,但得到了功能。 第一次失败了,第二次我做错了什么?

发生此错误是因为您将间谍添加到serviceMock对象而不是StoresService。 您也可以调用间谍的callFake方法来模拟服务

// Notice that you have to inject the StoresService here
beforeEach(inject(function($rootScope, $controller, $q, StoresService) {
    rootScope = $rootScope;
    scope = $rootScope.$new();
    controller = $controller;

    serviceMock = {
        getStores: function() {
            // mock promise
            var deferred = $q.defer();
            deferred.resolve({ data: 'foo' });
            return deferred.promise;
        },
        deleteStore: function() {
            var deferred = $q.defer();
            deferred.resolve ({ data: 'foo' });
            return deferred.promise;
        }
    }
    // Spy for getStores method
    spyOn(StoresService, 'getStores').and.callFake(serviceMock.getStores);
    // Spy for deleteStore method 
    spyOn(StoresService, 'deleteStore').and.callFake(serviceMock.deleteStore);
    // Removed the local  injection of StoresService
    controller("StoresListController", { $scope: scope });

}));

it('should call scope.getStores', function() {
    scope.$digest();
    expect(scope.getStores).toHaveBeenCalled()
});
it('should call scope.getStores afeter scope.deleteStore', function() {
    scope.deleteStore(1)
    scope.$digest();
    expect(scope.getStores.call.count).toBe(2)
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM