如何在Jasmine中对依赖服务的函数进行单元测试

How do I unit test a service-dependent function in Jasmine?

本文关键字:函数 单元测试 服务 依赖 Jasmine      更新时间:2023-09-26

我想在一个依赖于异步API调用的Angular控制器中对一个函数进行单元测试(一个承诺)。

我在控制器中有一个函数,它调用服务,并根据服务的结果在控制器中设置$scope变量:

$scope.display = 'loading';
$scope.loadData = function() {                           
        ApiService.getSummary().then(                 
            function (response) {                               
                $scope.displayData(response.data);
                $scope.display = 'boxes';                    
            },                                                  
            function (error) {                                  
                $scope.display = 'error';                    
            }                                                   
        );                                                      
    };

我有以下茉莉花单元测试

var FunctionFixtures = {
        successFunc: function() {
            var deferred = $q.defer();
            var response = {
                'data': dataVar
            };
            deferred.resolve(response);
            return deferred.promise;
        },
        errorFunc: function() {
            var deferred = $q.defer();
            deferred.reject();
            return deferred.promise;
        }
    };
it('should show the boxes on data load success', function(){
        spyOn(ApiService, 'getSummary').and.callFake(FunctionFixtures.successFunc);
        $scope.loadData();
        expect($scope.display).toBe('boxes');
    });

当我运行测试时,我得到以下错误:

Error: Expected 'loading' to be 'boxes'.   

我本质上想伪造api调用并返回成功或失败,并确保将$scope.display设置为适当的字符串,即"boxes"表示成功和"error"表示失败。有什么想法吗?

在对loadData()的调用之后,但在对expect的调用之前,似乎缺少对$rootScope.apply()的调用。

由于Angular promise是如何和$rootScope集成的,您需要为已解析的promise运行一个摘要循环来调用它们的回调,如https://code.angularjs.org/1.2.26/docs/api/ng/service/$q#测试。