简体   繁体   English

茉莉测试诺言角

[英]Testing promise angular with jasmine

I'm trying to check if a method with a promise has been called 我正在尝试检查是否已调用带有承诺的方法

Here's my controller 这是我的控制器

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();
        });

    };
})

and my test 和我的测试

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)
    });

});

I got Error: Expected a spy, but got Function. 我得到了错误:期望有一个间谍,但得到了功能。 for the first it failed for the second, what i'm doing wrong? 第一次失败了,第二次我做错了什么?

This error occurs because you add the Spy to the serviceMock object instead of the StoresService. 发生此错误是因为您将间谍添加到serviceMock对象而不是StoresService。 Also you can call the callFake method on the spy to mock the service 您也可以调用间谍的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