Test de l'unité de service qui retourne promesse Angularjs Jasmin
ÉDITÉ par Michal Charemza post.
J'ai un service qui représente angularui boîte de dialogue modale:
app.factory("dialogFactory", function($modal, $window, $q) {
function confirmDeleteDialog() {
var modalInstance = $modal.open({
templateUrl: "../application/factories/confirmDeleteDialog.htm",
controller: function($scope, $modalInstance) {
$scope.ok = function() {
$modalInstance.close("true");
};
$scope.cancel = function() {
$modalInstance.dismiss("false");
};
}
});
return modalInstance.result.then(function(response) {
return 'My other success result';
}, function(response) {
return $q.reject('My other failure reason');
});
};
return {
confirmDeleteDialog: confirmDeleteDialog
};
});
Sur l'appel de la méthode delete si l'utilisateur a cliqué sur Ok dans la boîte de dialogue requestNotificationChannel.deleteMessage(id)
est exécutée.
$scope.deleteMessage = function(id) {
var result = dialogFactory.confirmDeleteDialog();
result.then(function(response) {
requestNotificationChannel.deleteMessage(id);
});
};
Le problème est que je ne suis pas capable de l'unité de test.
C'est mon test. J'ai bien injecté le q de service mais je ne suis pas sûr de ce que doit je reviens de "confirmDeleteDialog"
espion...
describe("has a delete method that should call delete message notification", function() {
var deferred = $q.defer();
spyOn(dialogFactory, "confirmDeleteDialog").and.returnValue(deferred.promise);
spyOn(requestNotificationChannel, "deleteMessage");
$scope.deleteMessage(5);
deferred.resolve();
it("delete message notification is called", function() {
expect(requestNotificationChannel.deleteMessage).toHaveBeenCalled();
});
});
Mais je reçois expected spy deleteMessage to have been called
. Ce qui signifie que le result.then
... la partie n'est pas exécutée. Ce qui me manque ?
Vous devez vous connecter pour publier un commentaire.
De se moquer d'une fonction qui retourne une promesse, il faudra également le retour d'une promesse, qui doit ensuite être réglée comme une étape distincte.
Dans votre cas, la
deferred.resolve()
vous passez à l'espion qui doit être remplacé pardeferred.promise
, et le différé.resolve() effectuées séparément.Je soupçonne que vous devez également appeler
$rootScope.$digest()
, comme Angulaire de la promesse de la mise en œuvre est liée à la digérer boucle.Aussi, un peu sans rapport avec votre question, mais je ne pense pas que vous avez besoin pour créer votre propre objet reporté dans
confirmDeleteDialog
. Le (anti -) le modèle que vous utilisez a été qualifié de "Les Oubliés de la Promesse", comme dans http://taoofcode.net/promise-anti-patterns/Quand est plus simple, utilise moins de code, et je pense que cela permet une meilleure gestion des erreurs, vous pouvez simplement retourner la promesse que le
$modal
service crée:Si vous souhaitez modifier le type de la fonction d'appel voit, en termes de résolu/a rejeté les valeurs, vous pouvez créer un enchaînés à la promesse de retourner le résultat de
then
:Vous devriez vous voulez à faire si vous ne voulez pas exposer les rouages d'une fonction à son appelant. Ceci est analogue à la notion de re-lancer une exception dans la programmation synchrone.
$rootScope.$digest()
$digest()
est certainement nécessaire ici.