是否可以在karma中模拟angularjs工厂中的局部变量?

时间:2016-06-20 11:43:23

标签: angularjs unit-testing karma-jasmine

我有以下代码:

'use strict';

angular
    .module('testmodule')
    .factory('TestService', ['$q', '$timeout',
        function ($q, $timeout) {
  

var timeoutRetries = 0; // 需要从此处嘲笑

            var api = new TestApi();

            function getResults(id, prevDeferred) {
                var deferred = prevDeferred || $q.defer();

                function handleSuccessResponse(data) {
                    if (data.status === 'ready') {
                        results.put(id, data);
                        deferred.resolve(data);
                    } else {                        
  

if(++ timeoutRetries> 30){// 它不会进入

                            handleErrorResponse();
                        } else {
                            $timeout(function () {
                                getResults(id, deferred);
                            }, 2000);
                        }
                    }
                }

                function handleErrorResponse(response) {
                    deferred.reject(response);
                }

                if (results.get(id)) {
                    deferred.resolve(doSomething.get(id));
                    return deferred.promise;
                }

                api.get({id: id}).then(handleSuccessResponse, handleErrorResponse);
                return deferred.promise;
            }

            return {
                getResults: getResults
            };
        }]);

我正在尝试从karma模拟timeoutRetries条目,但我无法做到。它是声明它的理想方式,还是我想将变量移动到某个函数并更新,或者哪个是从业力中模拟它的最佳方式?

尝试使用inject,在调用函数之前声明变量。仍然没有成功。

1 个答案:

答案 0 :(得分:1)

您需要覆盖该分支,以便它自动覆盖局部变量。看起来你的测试没有涵盖那种情况。

您依赖于结果中的状态数据..如果它已准备就绪,您将返回结果..如果没有递增超时,如果它是> 30然后再次抛出错误消息或其他轮询结果,直到您获得状态为就绪或超时为30。

您可以轻松覆盖其他分支。

var isReadyTrue = false;
$httpBackend.expectGET(url).respond(function () {
            return [201, function(){
if (isReadyTrue) {
results.data = 'Ready';
} else {
results.data = 'Not Ready';
}
isReadyTrue = true; // Next result will be ready..

return results;
}];
        });

我们无法模拟局部变量,但我们可以通过模拟方案来覆盖它。

第一个结果将不是Ready,因此timeout将为1并进行轮询,Next结果将返回Ready数据。

您可以使用上面的组合和$ timeout

来模拟超时30