我有以下代码:
'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,在调用函数之前声明变量。仍然没有成功。
答案 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