Comment se moquer d'un appel http $ angulaire et retourner un objet promesse qui se comporte comme $ http
Est-il un moyen de retourner un HttpPromise (ou quelque chose de similaire) pour simuler un appel à $http
? Je veux définir une variable qui indique si le réel de la requête HTTP est fait ou si un faux HttpPromise objet est retourné avec de fausses données.
Par exemple, j'ai un service qui est similaire à ceci:
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);
}
};
} ]);
Et dans mon contrôleur, j'ai un appel à ce service qui ressemble à ceci:
//Somewhere in my controller
MyService.get($scope.itemId)
.success(function(data) {
$scope.item = data;
})
.error(function(data, status, headers, config) {
$scope.notFound = true;
});
Je suis en train de pas modifier le code du contrôleur, je veux le success
et error
le chaînage de continuer à travailler alors que dans mon "isInTestMode".
Est-il possible de simuler une HttpPromise
dans la façon que j'ai décrite dans le service?
Ci-dessous est une édition révisée de la "MyService" ci-dessus (un extrait) contenant un success
et error
sur la promesse de l'objet. Mais, comment dois-je exécuter l' success
méthode?
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);
}
}
source d'informationauteur whyceewhite
Vous devez vous connecter pour publier un commentaire.
Suffit d'utiliser la
deferred
méthode de la$q
serviceEt puis vous pouvez appeler votre fonction comme un
$http
promesse (vous devez personnaliser tout ce que vous voulez mettre à l'intérieur, bien sûr).J'ai trouvé que ce post est similaire à ce que j'ai demandé.
Cependant, je voulais un moyen de se moquer de mon appel de service, de sorte que de fausses données pourraient être retournés au lieu d'émettre une vraie requête HTTP appel. La meilleure façon de gérer cette situation, pour moi, est d'utiliser angulaire du
$httpBackend
service. Par exemple, pour contourner une requête GET à mes "articles" de la ressource, MAIS à pas de dérivation Obtient de mes partiels/templates je voudrais faire quelque chose comme ceci:Voir cette documentation pour plus d'informations sur $httpBackend.
J'ai enfin trouvé un moyen à l'aide de jasmin.
$httpBackend
était pas une option pour moi, car il y avait aussi des non-$http-méthodes-je besoin de fantaisie sur le même service. Je pense aussi que le test du contrôleur avoir besoin de spécifier l'url n'est pas parfait comme à mon humble avis le contrôleur et son test ne devrait pas avoir besoin de le savoir.Voici comment cela fonctionne:
Vous pouvez mettre en œuvre votre FakeHttp classe:
Puis dans votre code, vous seriez de retour d'un nouveau fakeHttp de la promesse.
La promesse doit être asynchrone, sinon ça ne marchera pas. Pour cela, vous pouvez utiliser $timeout.
facile comme bonjour!
Vous pouvez le faire en utilisant angulaires-se moque-async comme suit: