2016-04-11 5 views
0

Mocha 2.4.5とを使用してブラウザでテストを設定しようとしています。非同期アサーションでmochaエラーフォーマットを修正する方法

失敗アサーションは、有用なテスト失敗の理由を表示する必要があります。
しかし、同じアサーションがjQuery Ajaxコールバックのコンテキストで行われると、代わりにキャッチアサーションエラーが発生します。

は、次の例を見てみましょう:

mocha.setup('bdd'); 
var url = 'http://localhost/api/v2/People'; 
describe('ajax',() => { 
    var that1 = this; 
    it('Passing async assertion', (done) => { 
     $.ajax({ url: url }).done(data => { 
      should(1).be.eql(1); 
      done(); 
     }); 
    }); 
    it('Failing async assertion', (done) => { 
     var that2 = this; 
     $.ajax({ url: url }).done(data => { 
      should(0).be.eql(1); 
      done(); 
     }); 
    }); 
    it('Failing sync assertion', (done) => { 
     should(0).be.eql(1); 
     done(); 
    }); 
}); 
mocha.run(); 

「非同期アサーションを渡す」を通過して、テストランナーの出力にきれいに見えます。

「同期の主張を失敗」は失敗し、私は(結構です)失敗した「非同期アサーションに失敗」、しかし便利なスタックトレースに

Fail sync assertion ‣
AssertionError: expected 0 to equal 1
at Assertion.fail (http://path/to/should.js:220:17)
at Assertion.Object.defineProperty.value (http://path/to/should.js:292:19)
at Context. (tests.js:337:26)

を得るが、スタックトレースはuslessです。

Fail async assertion ‣
Error: Uncaught AssertionError (http://path/to/should.js:200)

私はthat1またはthat2にAJAXコンテキストを設定すると周りにプレイしましたが、それは違いはありません。

非同期アサーションが機能するようにテストケースをフォーマットする他の方法はありますか?

EDIT

私は私は私の質問に持っているようにモカのためのドキュメントの書式非同期テストを提案するが、私はそれらのだと思う非同期をシミュレートする

mocha.setup('bdd'); 
describe('ajax',() => { 
    var that1 = this; 
    it('Failing async assertion', (done) => { 
     setTimeout(() => { 
      should(0).be.eql(1); 
      done(); 
     }, 100); 
    }).async = true; 
    it('Failing sync assertion', (done) => { 
     should(0).be.eql(1); 
     done(); 
    }); 
}); 
mocha.run(); 

答えて

0

を簡単なタイムアウトを使用して同じものを取得docsはNode.jsテストランナーを念頭に置いて書かれています。

ブラウザでは、 'before'関数で非同期コードを実行し、格納された値に基づいて同期アサーションを行う必要があるようです。例えば

mocha.setup('bdd'); 
describe('ajax',() => { 
    var value = 0; 
    before((done) => { 
     //Do the asynchronous bit 
     setTimeout(() => { 
      //store the value for later comparison 
      value = 1; 
      done(); 
     }, 100); 
    }); 
    //These wont be called until after done() is called above. 
    //So value will be 1 
    it('Failing assertion',() => { 
     should(value).be.eql(0); 
    }); 
    it('Passing assertion',() => { 
     should(value).be.eql(1); 
    }); 
}); 
mocha.run(); 

ここで付加的な利点は、モカが習慣(ネットワーク遅延のような)外部要因によるスローとして非同期アサーションをフラグすることです。

関連する問題