Wie zu beheben verspricht in AngularJS, Jasmine 2.0, wenn es kein $scope zu zwingen, ein digest?

Scheint es, dass verspricht nicht auflösen in Eckig/Jasmine-tests, es sei denn, Sie erzwingen, dass ein $scope.$digest(). Das ist dumm IMO aber in Ordnung, ich habe, dass die Arbeit gegebenenfalls (Controller).

Die situation ich bin in nun ist, ich habe einen service, der könnte weniger Pflege über alle Bereiche in der Anwendung, alle es tut, wieder einige Daten aus dem server, aber das Versprechen scheint sich nicht zu lösen.

app.service('myService', function($q) {
  return {
    getSomething: function() {
      var deferred = $q.defer();
      deferred.resolve('test');
      return deferred.promise;
    }
  }
});

describe('Method: getSomething', function() {
  //In this case the expect()s are never executed
  it('should get something', function(done) {
    var promise = myService.getSomething();

    promise.then(function(resp) {
      expect(resp).toBe('test');      
      expect(1).toEqual(2);
    });

    done();
  });

  //This throws an error because done() is never called.
  //Error: Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.
  it('should get something', function(done) {
    var promise = myService.getSomething();

    promise.then(function(resp) {
      expect(resp).toBe('test');      
      expect(1).toEqual(2);
      done();
    });
  });
});

Was ist der richtige Weg, um das testen dieser Funktionalität?

Edit: Lösung für die Referenz. Anscheinend sind Sie gezwungen zu injizieren und zu verdauen den $rootScope, auch wenn der Dienst nicht verwenden.

  it('should get something', function($rootScope, done) {
    var promise = myService.getSomething();

    promise.then(function(resp) {
      expect(resp).toBe('test');      
    });

    $rootScope.$digest();
    done();
  }); 
Ich habe ein ng-service mit zwei Funktionen, die Rückgabewerte andere $q verspricht. Jasmin, ich könnte nicht erhalten, der test für die Funktion zu arbeiten, mit der Sie Ihre Vorschläge. Ich habe Jasmin timeout-Fehler. Meine .dann(cb) - Prozedur in meinem test war das aufrufen der Jasmin-done-handler, wie gezeigt, auf der Konsole Nachrichten rund gemacht call. Einzige, was funktionierte war $digest() in der service selbst nach dem beheben. Aber um Dinge zu machen, seltsamer, die zweite service-Funktion bekam eine ng Fehlermeldung, dass die "digest wurde bereits ausgeführt". Also kommentierte ich das digest aus und alles ist gut, aber keine Ahnung warum. Nun, das ist albern.
done Aufruf am Ende des Tests nicht sinnvoll. Der test ist nicht wirklich asynchron an dieser Stelle. Es sollte aufgerufen werden, am Ende .then anonyme Funktion. Und bei den Versprechen ist wirklich asynchronen sich anstelle von aufrufen digest einmal am Ende sollte es so etwas wie setInterval($rootScope.$digest, 100)

InformationsquelleAutor Terry | 2014-06-03

Schreibe einen Kommentar