Jasmin tester une promesse.alors la fonction
J'essaie de tester mon application avec le Jasmin et ai le problème suivant:
Je vais calculer quelque chose dans le then
fonction de ma promesse. C'est le point où j'ai besoin de tester mon code.
Voici le code de mon contrôleur:
TestCtrl.$inject = ["$scope", "TestService"];
/* ngInject */
function TestCtrl($scope, TestService) {
$scope.loadData = function () {
TestService.getData().then(function (response) {
$scope.data = response.data;
$scope.filtered = $scope.data.filter(function(item){
if(item.id > 1000){
return true;
}
return false;
})
});
}
}
Et mon Jasmin code de test:
describe('TestService tests', function () {
var $q;
beforeEach(function () {
module('pilot.fw.user');
});
beforeEach(inject(function (_$q_) {
$q = _$q_;
}));
describe('UserController Tests', function () {
beforeEach(inject(function (_$httpBackend_, $rootScope, $controller) {
this.scope = $rootScope.$new();
this.$rootscope = $rootScope;
this.$httpBackend = _$httpBackend_;
this.scope = $rootScope.$new();
var TestServiceMock = {
getData: function () {
var deferred = $q.defer();
var result = [{
"id": 1720,
"user": 1132
},
{
"id": 720,
"user": 132
}, {
"id": 1721,
"user": 1132
}];
deferred.promise.data = result;
deferred.resolve(result);
return deferred.promise;
}
};
this.controller = $controller('TestCtrl', {
'$scope': this.scope,
'TestService': TestServiceMock
});
}));
it('test', function(){
this.scope.loadData();
expect(true).toBeTruthy();
})
});
});
Chose étrange, je ne comprends pas, c'est (testé avec les journaux de la console):
- Ma promesse est créé et retourné
- Mon loadData fonction est appelée et qu'il va appeler la fonction getData() de la TestService
- Tout à l'intérieur de la fonction ne sera pas exécutée, bien que j'en retour la promesse comme résolu
Alors, comment pourrais-je tester le code à l'intérieur de la puis fonction?
Merci pour l'aide
Vous devez vous connecter pour publier un commentaire.
le jasmin, "elle", la méthode prend un paramètre fait que vous pouvez appeler pour async tests
N'hésitez pas à aller aussi profond que vous le souhaitez, juste être sûr d'appel fait quand TOUT est terminé. Jasmin du délai d'attente par défaut est de 5 secondes par test, donc si l'async truc n'est pas fait d'ici là jasmin en panne. Vous pouvez modifier ce paramètre dans les configs ou le mettre dans le terminal.
C'est directement à partir de l'jasmin docs, vous montrant comment gérer la valeur par défaut délai d'expiration de l'intervalle de
Je pense que si il ne fonctionne pas dans les 10 secondes, vous pouvez avoir défectueux méthodes. SURTOUT si vous vous adressez à un serveur local /db. Ce genre de choses ne devrait prendre cette longue si vous effectuez LOURDS calculs, ou de frapper une api externe avec un pas-si-grande connexion internet. Si tout est en local (ou écrasé /on se moque!) ensuite rien de plus de 5 à 10 secondes est nettement un drapeau rouge.
espère que cette solution vous aide. Une approche que j'ai trouvé utile lors de l'essai se moque de dépendances. J'ai essayé de commenter ce que j'ai fait autant que possible.
Officiel De Jasmin Docs expliquer la plupart des concepts largement. Espérons que la solution de l'aide!!!!
Permettez-moi de te dire ce que je fais, Angulaire 1.x et 2.x+ projets. Utiliser l'angle des outils de test pour se débarrasser de rappels/nids dans votre async tests. Dans angulaire 1.x, ce qui signifie une combinaison de q $et $rootScope.$appliquer(). Dans angulaire 2.x+, ce qui signifie quelque chose comme fakeAsync.
À partir de l'angle 1.x docs
L'inconvénient est que votre code est lié à angulaires, les avantages sont que votre code est plat et il est portable à 2.x+!
J'ai été un fan de la moka lanceur de test qui m'a permis de revenir promesses dans mes tests, vous pouvez essayer d'obtenir que le fait d'aller, mais il ya des inconvénients à cela comme la nécessité de modifier votre code spécifiquement pour un test.
En ce qui concerne votre contrôleur, vous devez "retour" des valeurs comme si.
Rappelez-vous que l'appel à quelque chose APRÈS", puis " ne veut rien dire, les valeurs doivent être appelée à l'INTÉRIEUR de l'époque. Pas après, ou avant. Mais à l'intérieur il. Comme Tom Green et que les pauvres de l'orignal dans Freddy Got Fingered.