2016-06-30 15 views
4

Ich habe einige Codes wie diese in meiner Komponente:Testing fangen Versprechen in Jasmin und AngularJS

p.a().then(function(x) { 
    vm.x = x; 
    return p.b(); 
}).then(function(y) { 
    if (!y) { 
    return $q.reject(new Error('My Error')); 
    } 
    vm.y = y; 
    return y; 
}).catch(function(error) { 
    log.error(error); 
}); 

Ich bin in der Lage, den Erfolg Fall zu testen fein:

it('is successful', function(done) { 
    spyOn(p, 'a').and.returnValue($q.resolve('x')); 
    spyOn(p, 'b').and.returnValue($q.resolve('y')); 

    $ctrl = $componentController('myComponent', { 
    $scope: $rootScope.$new() 
    }); 

    p.a().then(function() { 
    expect($ctrl.x).toEqual('x'); 
    return p.b(); 
    }).then(function() { 
    expect($ctrl.y).toEqual('y'); 
    done(); 
    }); 

    $timeout.flush(); 
}); 

Aber ich bin nicht in der Lage die catch und behaupten, den Fehler zu testen:

it('fails', function(done) { 
    spyOn(p, 'a').and.returnValue($q.resolve()); 
    spyOn(p, 'b').and.returnValue($q.resolve()); 

    $ctrl = $componentController('myComponent', { 
    $scope: $rootScope.$new() 
    }); 

    p.a().then(function() { 
    return p.b(); 
    }).catch(function(error) { 
    expect(error).toEqual(new Error('My Error')); 
    done(); 
    }); 

    $timeout.flush(); 
}); 

Alles, was ich, wenn ich die Tests laufen ist:

Was bedeutet, dass die catch nicht einmal läuft (Ich versuchte, etwas zu protokollieren, um zu überprüfen).

Irgendwelche Ideen was mache ich falsch?

+0

Ich bin nicht sicher, was Sie versuchen, hier zu tun .. warum aren t Rufen Sie irgendwelche Funktionen auf Ihrem Controller '$ ctrl' auf? Was testest du? Der Code im Test? – Sonata

+0

@Sonata, was meinst du? Ich rufe 'p.a()' und 'p.b()' beide Versprechen zurück und nachdem sie auflösen, setze ich einige Daten im Controller, das ist, was ich gerade teste, 'vm === $ ctrl' – jefujire

Antwort

0

Überlegen Sie statt der jasmine done-Funktion, $ $ rootScope zu verwenden. $ Apply(); kaufen diese Winkel tun läuft automatisch die Versprechen

Denken Sie daran, den folgenden Code zu setzen $ rootScope in den Tests zu injizieren:

var $rootScope; 
    beforeEach(inject(function(_$rootScope_) { 
     $rootScope=_$rootScope_.$new(); 
    })); 
Verwandte Themen