タイムアウトを増やすだけの「解決策」は、ここで実際に起こっていることを覆い隠していることがわかります。
- コードやネットワークの呼び出しが遅すぎる(ユーザーエクスペリエンスを向上させるには100ミリ秒未満である必要があります)
- アサーション(テスト)が失敗し、Mochaがアサーションを実行する前に何かがエラーを飲み込んでいます。
通常、Mochaがコールバックからアサーションエラーを受信しない場合、#2が発生します。これは、スタックのさらに上位で例外を飲み込む他のコードが原因です。これに対処する正しい方法は、コードを修正してエラーを飲み込まないことですです。
外部コードがエラーを飲み込んだとき
変更できないライブラリ関数の場合は、アサーションエラーをキャッチして自分でMochaに渡す必要があります。これを行うには、アサーションコールバックをtry / catchブロックでラップし、すべての例外をdoneハンドラーに渡します。
it('should not fail', function (done) { // Pass reference here!
i_swallow_errors(function (err, result) {
try { // boilerplate to be able to get the assert failures
assert.ok(true);
assert.equal(result, 'bar');
done();
} catch (error) {
done(error);
}
});
});
もちろん、このボイラープレートをいくつかのユーティリティ関数に抽出して、テストをもう少し見やすくすることができます。
it('should not fail', function (done) { // Pass reference here!
i_swallow_errors(handleError(done, function (err, result) {
assert.equal(result, 'bar');
}));
});
// reusable boilerplate to be able to get the assert failures
function handleError(done, fn) {
try {
fn();
done();
} catch (error) {
done(error);
}
}
ネットワークテストの高速化
それ以外は、機能しているネットワークに依存せずにテストに合格するために、ネットワーク呼び出しにテストスタブを使い始める際のアドバイスを参考にしてください。モカ、チャイ、シノンを使用すると、テストは次のようになります。
describe('api tests normally involving network calls', function() {
beforeEach: function () {
this.xhr = sinon.useFakeXMLHttpRequest();
var requests = this.requests = [];
this.xhr.onCreate = function (xhr) {
requests.push(xhr);
};
},
afterEach: function () {
this.xhr.restore();
}
it("should fetch comments from server", function () {
var callback = sinon.spy();
myLib.getCommentsFor("/some/article", callback);
assertEquals(1, this.requests.length);
this.requests[0].respond(200, { "Content-Type": "application/json" },
'[{ "id": 12, "comment": "Hey there" }]');
expect(callback.calledWith([{ id: 12, comment: "Hey there" }])).to.be.true;
});
});
詳細については、Sinonのnise
ドキュメントを参照してください。