La fixation d'un délai d'attente de gestionnaire sur une promesse en angularjs
Je suis en train de définir un délai d'attente dans mon contrôleur, de sorte que, si une réponse n'est pas reçue dans les 250ms il doit échouer. J'ai mis mon test de l'unité ont un délai d'attente de 10 000 de sorte que cette condition soit remplie,quelqu'un Peut me pointer dans la bonne direction? ( EDIT je suis en train de réaliser cela sans l'aide de l' $http service qui, je le sais fournit délai functinality)
(MODIFIER - mes autres tests unitaires ont été faute parce que je n'étais pas à l'appel de délai d'attente.chasse sur eux, maintenant, j'ai juste besoin d'obtenir le délai d'attente de message de coups de pied dans quand un indéfini promesse est retournée par promiseService.getPromise(). J'ai enlevé le début du code à partir de la question) .
promiseService (promesse est une suite de test de la variable de me permettre d'utiliser des comportements différents pour la même promesse, dans chaque suite de test avant de l'appliquer, par exemple, de rejeter dans l'un, succès dans un autre)
mockPromiseService = jasmine.createSpyObj('promiseService', ['getPromise']);
mockPromiseService.getPromise.andCallFake( function() {
promise = $q.defer();
return promise.promise;
})
Fonction de contrôleur qui est testé -
$scope.qPromiseCall = function() {
var timeoutdata = null;
$timeout(function() {
promise = promiseService.getPromise();
promise.then(function (data) {
timeoutdata = data;
if (data == "promise success!") {
console.log("success");
} else {
console.log("function failure");
}
}, function (error) {
console.log("promise failure")
}
)
}, 250).then(function (data) {
if(typeof timeoutdata === "undefined" ) {
console.log("Timed out")
}
},function( error ){
console.log("timed out!");
});
}
Test (normalement je résoudre ou de rejeter la promesse ici, mais en ne le définissant pas, je suis de la simulation d'un délai d'attente)
it('Timeout logs promise failure', function(){
spyOn(console, 'log');
scope.qPromiseCall();
$timeout.flush(251);
$rootScope.$apply();
expect(console.log).toHaveBeenCalledWith("Timed out");
})
promiseService.getPromise()
?Il n'est pas encore mis en œuvre que j'essaie de faire ce conçu d'abord, doit-il être lié à la mise en œuvre de la promesse de service?
Comment pouvez-vous dire qu'il ne fonctionne pas si vous n'avez pas encore mise en oeuvre
C'est une unité de test, donc je suis à l'injection de la promiseService.getPromise... que je tape ce que je réalise que je n'ai pas l'injecter du code, en ajoutant maintenant sry
Je ne vois pas le nombre '250' n'importe où dans votre code... comment vous attendez-vous à faire quelque chose après 250 ms?
OriginalL'auteur SMC | 2014-04-10
Vous devez vous connecter pour publier un commentaire.
Tout d'abord, je tiens à dire que votre contrôleur de mise en œuvre devrait être quelque chose comme ceci:
Vos tests:
DÉMO
Un autre exemple avec
promiseService.getPromise
:Vos tests sont similaires à l'exemple ci-dessus:
DÉMO
avez-vous regarder mon deuxième exemple? Cela répond-il à vos besoins?
Grâce à vous, je suis toujours avoir mon café du matin donc j'ai complètement raté la deuxième démo. Dans cet exemple, dans la vraie vie, comment vous allez sur la manipulation de l'expiration de la promiseService promesse d'une façon qui est propre et empêche la promesse de revenir plus tard dans un délai inattendu et de déclencher une question?
vérifier mes mises à jour de réponse pour le voir vous en êtes satisfait. Dans cet exemple, je bouge tout le code d'une fonction. C'est juste une démo de l'idée. Les touches sont de rejet de la promesse, si le délai d'attente se produit et l'annulation du délai d'attente si la réponse arrive avant l'expiration du délai.
Désolé, je ne savais pas que vous avez cliqué aussi d'attribution de la prime, j'ai été satisfait de toute façon. Edit - c'est à dire 3 heures jusqu'à ce que je l'accepte, sera de le faire alors, merci beaucoup
OriginalL'auteur
Le comportement de "à défaut de promesse, à moins que c'est résolu avec un délai déterminé" semble idéal pour le refactoring dans un service distinct/usine. Cela devrait rendre le code à la fois le nouveau service d'usine/le contrôleur et le plus clair et le plus ré-utilisable.
Le contrôleur, j'ai supposé juste détermine le succès ou l'échec sur la portée:
Et de l'usine,
failUnlessResolvedWithin
, crée une nouvelle promesse, qui est effectivement "intercepte" une promesse d'un passé à la fonction. Elle retourne une nouvelle réplique de sa volonté ou de rejeter des comportements, sauf qu'il rejette également la promesse s'il n'a pas été réglée dans le délai d'attente:Les tests sont un peu délicate (et long), mais vous pouvez les voir à http://plnkr.co/edit/3e4htwMI5fh595ggZY7h?p=preview . Les principaux points de l'tests sont
Les tests pour le contrôleur se moque de
failUnlessResolvedWithin
avec un appel à$timeout
.C'est possible depuis failUnlessResolvedWithin' est (volontairement) la syntaxe est équivalente à
$timeout
, et a fait depuis$timeout
fournit laflush
fonction pour tester différents cas de figure.Les tests pour le service lui-même utilise des appels
$timeout.flush
pour tester le comportement des différents cas de la promesse d'origine étant résolu, rejetée avant/après l'expiration du délai.Vous pouvez voir tout cela en action à http://plnkr.co/edit/3e4htwMI5fh595ggZY7h?p=preview
Je ne pense pas que ma réponse exige quoi que ce soit concernant la
$http
service. LegetPromise
peut être une fonction qui renvoie une promesse. Pouvez-vous préciser pourquoi vous pensez que cela fonctionne? Ou si je suis de l'incompréhension, de clarifier vos besoins dans la question.La réponse se nourrit le délai d'attente à l' $http appel qui gère le délai d'attente n'est-ce pas?
Je ne suis pas sûr de ce que vous entendez par l'alimentation, mais la seule Angulaire des services que j'utilise sont
$q
et$timeout
. Aucun d'eux, puis d'appeler quelque chose de$http
(autant que je sache).J'ai ajouté une réponse qui est un dérivé de l'original de votre réponse.
OriginalL'auteur
Ma mise en œuvre de @Michal Charemza 's failUnlessResolvedWithin avec un réel de l'échantillon.
En passant différée objet de la touche func il réduit les avoir à instancier une promesse en l'utilisation de code "ByUserPosition". M'aide à composer avec firefox et à la géolocalisation.
OriginalL'auteur