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

Is it possible to mock local variable in angularjs factory from karma?

我有以下代码:

'use strict';

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

var timeoutRetries = 0; // need to mock this from here

            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) { // It wont get in here

                            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,在调用函数之前声明变量。仍然没有成功。

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

您依赖于结果中的状态数据。如果准备就绪,您将返回结果。如果不增加超时,如果超时 > 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;
}];
        });

我们不能模拟局部变量,但我们可以模拟场景来覆盖它。

第一个结果未就绪,因此超时将为 1 并进行轮询,下一个结果 returns 具有就绪数据。

您可以使用以上和 $timeout 的组合模拟超时 30