【问题标题】:How do I unit test a service-dependent function in Jasmine?如何在 Jasmine 中对依赖于服务的函数进行单元测试?
【发布时间】:2014-10-10 18:27:31
【问题描述】:

我想在依赖于异步 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';                    
            }                                                   
        );                                                      
    };

我有以下 Jasmine 单元测试

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”失败。关于如何做到这一点的任何想法?

【问题讨论】:

  • 你的测试中是否缺少$scope.loadData()!?
  • 不,抱歉@friedi,我只是省略了在测试中调用 $scope.loadData() 的那一行。我在这里简化了代码,使其更通用。

标签: javascript angularjs unit-testing jasmine karma-jasmine


【解决方案1】:

您似乎在调用loadData() 之后但在调用expect 之前错过了对$rootScope.apply() 的调用。

由于 Angular Promise 与 $rootScope 的集成方式,您需要为已解决的 Promise 运行摘要循环以调用其回调,如 https://code.angularjs.org/1.2.26/docs/api/ng/service/$q#testing 所示。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-22
    • 2019-04-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多