Angularjs prometem não ser resolvido em teste unitário
Eu estou usando jasmine para teste de unidade um controlador angularjs que define uma variável no escopo para o resultado de chamar um método de serviço que retorna um objeto de promessa:
var MyController = function($scope, service) {
$scope.myVar = service.getStuff();
}
dentro do serviço:
function getStuff() {
return $http.get( 'api/stuff' ).then( function ( httpResult ) {
return httpResult.data;
} );
}
Isso funciona bem no contexto do meu aplicativo angularjs, mas não funciona no teste da unidade de jasmim. Confirmei que o callback "then" está sendo executado no teste de unidade, mas a promessa $ scope.myVar nunca é definida como o valor de retorno do retorno de chamada.
Meu teste de unidade:
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" );
} );
} );
Além disso, se eu mudar o controlador para o seguinte, o teste da unidade passa:
var MyController = function($scope, service) {
service.getStuff().then(function(result) {
$scope.myVar = result;
});
}
Por que o valor do resultado de retorno de chamada da promessa não está sendo propagado para $ scope.myVar no teste de unidade? Veja o seguinte jsfiddle para o código de trabalho completohttp://jsfiddle.net/s7PGg/5/