2014-02-08 5 views
6

ich den grundlegenden Karma/Jasmin Setup bin mit meinem Angular Code zu testen. Hier ist mein Test:Wie löse ich ein Versprechen in einem Winkel Unit-Test

var $controllerConstructor, ctr, mockSuperheroData, scope, deferred, q; 

describe('main controller', function() { 
    var $controllerConstructor, ctr, mockSuperheroData, scope, deferred, q; 


    beforeEach(inject(function($controller, $rootScope, $q) { 
    scope = $rootScope.$new(); 
    $controllerConstructor = $controller; 
    q = $q; 
    mockSuperheroData = { 
     getSuperheroes: function() { 
     deferred = q.defer(); 
     return deferred.promise; 
     } 
    }; 
    ctr = $controllerConstructor('MainCtrl', {$scope: scope, $location: {}, superheroService: mockSuperheroData, keys: {}}); 
    })); 

    it('should set the result of getResource to scope.heroes', function() { 
    scope.getHeroes(); 
    expect(scope.heroes).toBe(100); 
    }); 
} 

scope.getHeroes() ruft die mockSuperheroData.getSuperheroes(), die ein Versprechen zurückkehrt. Wie erzwinge ich das Versprechen, das, was ich will, im Komponententest zurückzugeben? Wo kann ich das Versprechen eingehen, seine Rückkehr zu verspotten?

+0

Sie könnten wirklich einige 'var' Deklarationen verwenden ... – Bergi

+0

Sorry, ich habe vergessen, sie zu der Frage hinzuzufügen, aber jetzt sind sie da. – jhamm

Antwort

4

Wie zwinge ich das Versprechen, das, was ich will, im Komponententest zurückzugeben?

Grundsätzlich müssen Sie resolve on the Deferred nennen:

deferred.resolve(100); 

Sie entweder, dass direkt vor dem return deferred.promise oder in einem asynchronen setTimeout setzen können.

2
var $controllerConstructor, ctr, mockSuperheroData, scope, deferred, q; 

describe('main controller', function() { 
    var $controllerConstructor, ctr, mockSuperheroData, scope, deferred, q, rootScope; 


    beforeEach(inject(function($controller, $rootScope, $q) { 
    scope = $rootScope.$new(); 
    $controllerConstructor = $controller; 
    q = $q; 
    rootScope = $rootScope; 
    mockSuperheroData = { 
     getSuperheroes: function() { 
     deferred = q.defer(); 
     return deferred.promise; 
     } 
    }; 
    ctr = $controllerConstructor('MainCtrl', {$scope: scope, $location: {}, superheroService: mockSuperheroData, keys: {}}); 
    })); 

    it('should set the result of getResource to scope.heroes', function() { 
    scope.getHeroes(); 

    deferred.resolve(100); 
    rootScope.$apply(); 

    expect(scope.heroes).toBe(100); 
    }); 
}); 

Es sollte erwähnt werden, dass, weil $ q mit $ rootScope integriert ist, nicht nur tun, müssen Sie die latenten Objekt lösen, aber Sie müssen auch die Änderungen propagieren von $ rootScope aufrufen. $ Gelten.

Ich schrieb einen Blog auf spöttische Winkel Versprechen bei projectpoppycock

und ich schrieb als ein Arbeitsbeispiel, mit Tests, bei plunkr

Ich mag die Art und Weise sind Sie spritzt den mock-Service Abhängigkeit des Controllers von der Verwendung des $ controller-Dienstes, muss ich möglicherweise meine Vorgehensweise ändern. Dein Weg ist besser :) Danke!

+0

Die '. $ (Gilt)' sehr wichtig --- danke! +1 –

Verwandte Themen