Erreur-type:Impossible de lire la propriété « puis » du test angulaire js-grunt non défini
-
21-12-2019 - |
Question
J'utilise le service $q pour passer des appels asynchrones.Je ne peux pas résoudre « alors » et « différer » dans les tests unitaires utilisant le karma.
Ce qui suit est mon code de contrôleur.
scope.filterUrls = [{url:'page1'}, {url: 'page2'}, {url:'page-error'}];
scope.bindFilters = function () {
angular.forEach(scope.filterUrls, function (data) {
scope.getFilterData(data.url, '').then(function (result) {
if (data.url === 'page1') {
scope.moduleData.index = result.data;
} else if (data.url === 'page2') {
scope.moduleData.page2 = result.data;
}
});
});
}
scope.getFilterData = function (filterUrls, params) {
// $q service object
var deferred = q.defer();
// regular ajax request
http({
method: 'GET',
url: app.api.root + filterUrls,
params: params
})
.success(function (result) {
// promise resolve
deferred.resolve(result);
})
.error(function (result) {
// called asynchronously if an error occurs
// or server returns response with an error status.
deferred.reject('Erreur request : ' + result);
});
return deferred.promise;
};
spécification de test :
it('should call getFilterData() in bindFilters()', function () {
spyOn(scope, 'getFilterData');
scope.bindFilters();
expect(scope.getFilterData).toHaveBeenCalled();
});
Je reçois une erreur appelée "TypeError :Impossible de lire la propriété « puis » de non défini".
Comment puis-je écrire un test unitaire pour ces deux méthodes en utilisant le karma.
Mise à jour:
1.comment pouvons-nous tester le succès et l'erreur de scope.getFilterData()
2 .puis fonction dans la fonction scope.bindFilters().
S'il vous plaît, aidez ..
La solution
Si tu seulement il faut savoir si getFilterData
est appelé ou pas, essayez de renvoyer une fausse promesse en simulant la fonction :
Avec Jasmine 1.3, nous pourrions utiliser andCallFake
:
it('should call getFilterData() in bindFilters()', function () {
spyOn(scope, 'getFilterData').andCallFake(function(){//replace with a fake function
var deferred = $q.defer(); //assume that you already inject $q service in beforeEach and save it as a variable.
return deferred.promise; //returns a fake promise
});
scope.bindFilters();
expect(scope.getFilterData).toHaveBeenCalled();
});
Avec Jasmine 2.0, nous pourrions utiliser and.callFake
plutôt.
Une autre solution consiste à utiliser andReturnValue
et $q.when()
:
it('should call getFilterData() in bindFilters()', function () {
spyOn(scope, 'getFilterData').andReturnValue($q.when());
scope.bindFilters();
expect(scope.getFilterData).toHaveBeenCalled();
});
Avec Jasmine 2.0, nous pourrions utiliser and.returnValue
plutôt.