I Jasmin zu Unit-Test ein AngularJS Controller verwende, die eine Variable auf den Umfang des Ergebnisses setzt zur Herstellung eines Service-Methode aufrufen, die ein Versprechen Objekt zurückgibt:AngularJS versprechen, nicht in Unit-Test ist
var MyController = function($scope, service) {
$scope.myVar = service.getStuff();
}
innen der Service:
function getStuff() {
return $http.get('api/stuff').then(function (httpResult) {
return httpResult.data;
});
}
Dies funktioniert im Rahmen meiner AngularJS Anwendung in Ordnung, aber in dem Jasmin Unit-Test nicht funktioniert. Ich habe bestätigt, dass der "then" Callback im Komponententest ausgeführt wird, aber das $ scope.myVar Versprechen wird niemals auf den Rückgabewert des Callbacks gesetzt.
My Unit-Test:
describe('My Controller', function() {
var scope;
var serviceMock;
var controller;
var httpBackend;
beforeEach(inject(function ($rootScope, $controller, $httpBackend, $http) {
scope = $rootScope.$new();
httpBackend = $httpBackend;
serviceMock = {
stuffArray: [{
FirstName: "Robby"
}],
getStuff: function() {
return $http.get('api/stuff').then(function (httpResult) {
return httpResult.data;
});
}
};
$httpBackend.whenGET('api/stuff').respond(serviceMock.stuffArray);
controller = $controller(MyController, {
$scope: scope,
service: serviceMock
});
}));
it('should set myVar to the resolved promise value',
function() {
httpBackend.flush();
scope.$root.$digest();
expect(scope.myVar[0].FirstName).toEqual("Robby");
});
});
Auch, wenn ich den Regler auf die im Anschluss an die Einheit Test bestanden ändern:
var MyController = function($scope, service) {
service.getStuff().then(function(result) {
$scope.myVar = result;
});
}
Warum das Ergebnis Versprechen Rückruf Wert nicht mehr als $ Umfang wird propagierten .myVar im Komponententest? Siehe den folgenden jsfiddle für vollen Arbeitscode http://jsfiddle.net/s7PGg/5/
große Antwort, schien ich, dass etwas in der Dokumentation verpasst zu haben. – robbymurphy
Wenn Sie das Backend verspotten, wie ich bin, wird das Ergebnis ein Composite mit einer Eigenschaft "Daten" sein, die den eigentlichen Antwortinhalt enthält. – Gepsens
In Angular 1.2 werden Versprechungen nicht mehr automatisch aufgelöst (AKA, unwrapped). – zhon