Unit-Test-Service, der Versprechen verspricht Angularjs Jasmine
BEARBEITET pro Michal Charemza post.
Ich habe einen Dienst, stellt angularui modal dialog:
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
};
});
Über den Aufruf der delete-Methode, wenn der Benutzer hat auf Ok geklickt haben aus dem dialog requestNotificationChannel.deleteMessage(id)
ausgeführt wird.
$scope.deleteMessage = function(id) {
var result = dialogFactory.confirmDeleteDialog();
result.then(function(response) {
requestNotificationChannel.deleteMessage(id);
});
};
Das problem ist, ich bin nicht in der Lage, unit-test.
Dies ist mein test. Habe ich richtig gespritzt die q-service, aber ich nicht sicher bin, was sollte ich zurück von der "confirmDeleteDialog"
spy...
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();
});
});
Aber ich erhalte expected spy deleteMessage to have been called
. Das bedeutet, dass die result.then
... Teil nicht ausgeführt. Was bin ich ?
InformationsquelleAutor der Frage Mdb | 2014-04-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zu verspotten, eine Funktion, die eine Zusage zurückgibt, wird es brauchen, um auch wieder ein Versprechen, das dann aufgelöst werden muss, in einem separaten Schritt.
In Ihrem Fall die
deferred.resolve()
Sie an die Spionage ersetzt werden muss mitdeferred.promise
, und die latente.resolve() getrennt durchgeführt.Ich vermute, dass Sie auch benötigen, rufen Sie
$rootScope.$digest()
als Winkel-Versprechen-Durchführung ist gebunden an die digest-loop.Auch etwas unabhängig von deiner Frage, aber ich glaube nicht, dass Sie brauchen, um zu erstellen Sie Ihre eigenen latenten Objekt in
confirmDeleteDialog
. Die (anti -) Muster, die Sie verwenden, wurde als "Das Vergessene Versprechen", wie in http://taoofcode.net/promise-anti-patterns/Wenn ist einfacher, benötigt weniger code, und ich denke, dass eine bessere Fehlerbehandlung, können Sie nur wieder das Versprechen, dass die
$modal
service erstellt:Wenn Sie möchten, zu ändern, was die aufrufende Funktion sieht, in Bezug auf gelöst/abgelehnt-Werte, Sie können erstellen einer verketteten Versprechen durch Rücksendung der Ergebnis
then
:Würden Sie normalerweise tun, wenn Sie nicht wollen, zu entlarven die innere Funktionsweise einer Funktion an den Aufrufer. Dies ist Analog zu dem Konzept der re-auslösen einer Ausnahme bei der synchronen Programmierung.
InformationsquelleAutor der Antwort Michal Charemza