2017-09-05 3 views
0

角度アプリの単体テストを書く際に予期しない結果が発生しました。予期しない動作をサンプルテストに凝縮することができました。失敗したアサーションが約束を引き起こすのはなぜですか?

thenブロックのアサーションエラーは、約束のキャッチブロックを引き起こすようです。私はこのテストを実行すると

describe.only('test', function() { 
    var $q, $rootScope; 
    beforeEach(function() { 
    inject(function(_$q_, _$rootScope_) { 
     $q = _$q_; 
     $rootScope = _$rootScope_.$new(); 
    }); 
    }); 


    var stubService = sinon.stub(service, 'getPanel'); 

    it('shall...', function() { 
    //1 
    $q.when().then(function() { 
     console.log('log then') 
     should.equal(true, false, 'should then') //<---assertion fails 
    }).catch(function() { 
     console.log('log catch') //<--- why does this block run? 
     should.equal(true, false, 'should catch') 
    }) 
    $rootScope.$apply(); //wait for promises to finish 

    }); 
}); 

出力は次のとおりです。

LOG LOG: 'log then' 
LOG LOG: 'log catch' 

    test 
    ✗ shall... 
    should catch: expected true to equal false 

私は予想:

LOG LOG: 'log then' 

    test 
    ✗ shall... 
    should then: expected true to equal false 

私は私が期待した結果を得るこのスタイルを使用する場合:

$q.when().then(function() { 
    console.log('log then') 
    should.equal(true, false, 'should then') 
}, function() { 
    console.log('log catch') 
    should.equal(true, false, 'should catch') 
}) 

私の会社のコンベンションは、私は可能な場合は最初のスタイルを使用したいと思います。

答えて

1

あなたが観察している動作についての1つの説明は、条件が満たされていないときに実際にthrows an errorアサーションがthrows an errorの下にあることです。

ハンドラ関数(onFulfilledまたはonRejected)、その後(とすぐにスタックが空であると)非同期で呼び出されます:

あなたが$qを使用しているが、私は強調鉱山は、このdocumentation on Promise behaviourはまだ適用されると信じています。ハンドラ関数の呼び出し後、ハンドラ関数:... がエラーをスローした場合、返された約束は、スローされたエラーで拒否され、その値はとなります。

だから、あなたの場合には、should.equalによってスローされたエラーが拒否値がスローされたエラーであることで、実行するcatchためのコードブロックの原因となります。

関連する問題