【发布时间】:2014-08-14 22:18:59
【问题描述】:
有没有办法返回一个 HttpPromise(或类似的东西)来模拟对 $http 的调用?我想设置一个全局变量来指示是否发出了真正的 HTTP 请求,或者是否返回了带有假数据的假 HttpPromise 对象。
比如我有一个类似这样的服务:
angular
.module('myservice')
.factory('MyService', ['$http', function($http) {
return {
get : function(itemId) {
if (isInTestingMode) {
// return a promise obj that returns success and fake data
}
return $http.get("/myapp/items/" + itemId);
}
};
} ]);
在我的控制器中,我调用了与上述类似的服务:
// Somewhere in my controller
MyService.get($scope.itemId)
.success(function(data) {
$scope.item = data;
})
.error(function(data, status, headers, config) {
$scope.notFound = true;
});
我正在尝试不更改控制器代码;我希望success 和error 链接在我的“isInTestMode”中仍然有效。
是否可以按照我在服务中描述的方式伪造HttpPromise?
下面是上述“MyService”的修订版(sn-p),在 promise 对象上包含 success 和 error。但是,我该如何执行success 方法呢?
return {
get : function(itemId) {
if (isInTestingMode) {
var promise = $.defer().promise;
// Mimicking $http.get's success
promise.success = function(fn) {
promise.then(function() {
fn({ itemId : "123", name : "ItemName"}, 200, {}, {});
});
return promise;
};
// Mimicking $http.get's error
promise.error = function(fn) {
promise.then(null, function(response) {
fn("Error", 404, {}, {});
});
return promise;
};
return promise;
}
return $http.get("/myapp/items/" + itemId);
}
}
【问题讨论】:
标签: angularjs angularjs-http angular-mock