Angularjs versprechen, im Unit-Test nicht gelöst zu werden

Ich benutze Jasmin, um einen AngularJS-Controller zu testen, der eine Variable für den Gültigkeitsbereich auf das Ergebnis des Aufrufs einer Dienstmethode festlegt, die ein Versprechungsobjekt zurückgibt:

var MyController = function($scope, service) {
    $scope.myVar = service.getStuff();
}

innerhalb des Dienstes:

function getStuff() {
    return $http.get( 'api/stuff' ).then( function ( httpResult ) {
        return httpResult.data;
    } );
}

Dies funktioniert im Kontext meiner AngularJS-Anwendung einwandfrei, im Jasmin-Unit-Test jedoch nicht. Ich habe bestätigt, dass der Rückruf "then" im Komponententest ausgeführt wird, aber das Versprechen "$ scope.myVar" wird niemals auf den Rückgabewert des Rückrufs gesetzt.

Mein 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" );
    } );
} );

Wenn ich den Controller folgendermaßen ändere, besteht der Komponententest auch:

var MyController = function($scope, service) {
    service.getStuff().then(function(result) {
        $scope.myVar = result;
    });
}

Warum wird der Ergebniswert des Versprechen-Rückrufs im Komponententest nicht an $ scope.myVar weitergegeben? In der folgenden jsfiddle finden Sie den vollständigen Funktionscodehttp://jsfiddle.net/s7PGg/5/

Antworten auf die Frage(3)

Ihre Antwort auf die Frage