2016-06-30 7 views
4

私は私のコンポーネント内でこのようないくつかのコードを持っている:私は罰金成功ケースをテストすることができるよテストキャッチジャスミンでの約束と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); 
}); 

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(); 
}); 

をしかし、私はできませんよcatchをテストしてエラーを主張することは:

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(); 
}); 

私がテストを実行したときに私が得るすべては、次のとおりです。

Error: Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.

これは、catchが実行されていないことを意味します(私は二重チェックするために何かを記録しようとしました)。

私は間違って何をしていますか?

+0

を私はあなたがここでやろうとしているかわからない。この角度をやっ 購入は自動的に約束

テストでの$ rootScopeを注入するために、次のコードを置くことを忘れないでくださいを実行しますあなたのコントローラ '$ ctrl'上の関数を呼び出すのですか?あなたは何をテストしていますか?テストのコードは? – Sonata

+0

@ソナタ、どういう意味ですか?私は 'p.a()'と 'p.b()'を呼び出して約束を返し、コントローラで何らかのデータを設定した後、それをテストします。 'vm === $ ctrl' – jefujire

答えて

0

jasmine done機能を使用して$ rootScopeを使用する代わりに、$ apply();を使用することを検討してください。 ...なぜ「AREN

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