Mochajsでは、次のようにdone()
を使用して非同期コードをテストします。
_describe('User', function() {
describe('#save()', function() {
it('should save without error', function(done) {
var user = new User('Luna');
user.save(function(err) {
if (err) throw err;
done();
});
});
});
});
_
これはどういう意味ですか?私はconsole.log(done.toString())
をしました、そして、私はこれを得ました:
_function (err) {
if (err instanceof Error || toString.call(err) === '[object Error]') {
return done(err);
}
if (err) {
if (Object.prototype.toString.call(err) === '[object Object]') {
return done(new Error('done() invoked with non-Error: '
+ JSON.stringify(err)));
}
return done(new Error('done() invoked with non-Error: ' + err));
}
done();
}
_
ここの最後のdone()
は、最初のコードのdone()
と異なりますか?
Mochaは、同期テストと非同期テストを処理できます。同期テストを実行する場合、匿名関数としてit
に渡すだけで、他に何もする必要はありません。Mochaは、関数が戻るとテストが終了したことを認識します。ただし、非同期テストを実行している場合、Mochaにテストが非同期であることを伝える必要があります。これを行うには2つの方法があります。
it
に渡す匿名関数がパラメーターを取ることを宣言します。 Mochaは、テストが終了したことを示すために呼び出す必要がある関数である単一のパラメーターを使用して、匿名関数を呼び出します。 (このパラメーターは、伝統によりdone
と呼ばれます。complete
、cb
、またはplatypus
と呼ぶことができ、同じように機能します。)値なしでdone
を呼び出すと、テストは成功します。値がある場合、テストは失敗であり、値はError
オブジェクトまたはError
から派生したオブジェクトでなければなりません。
約束を返す:Mochaは、約束が解決または拒否されるのを待ちます。解決したら、テストは成功です。拒否された場合、テストは失敗しました。
done.toString()
を実行すると表示されるコードは、Mochaがパラメーターを取るように宣言したときにテストに渡される関数のコードです。上記で説明した内容の一部を見ることができます(たとえば、パラメーターをdone
に渡す場合は、Error
またはError
から派生する必要があります)。のdone
には、Mocha専用の別のdone
関数があります。
Node.jsは非同期であるため、テストが終了したことをMochaに伝える必要があります。
古典的な同期言語の場合、メソッドが終了したら完了です。ただし、ノードでは、最初にメソッド全体が実行され、その後しばらくしてuser.save()
の内部本体が実行されます。
Mochaはdone()
が呼び出されるまでテストで待機します。これは、他の何かを実行するか終了するかを検出する他のオプションがないためです。
あなたが持っている出力は、関数done
の本体です。
Before()、after()、beforeEach()、afterEach()を含むすべてのテストケースは、最後にdone()を呼び出して、すべてのタスクが完了したことをmochaに通知する必要があります。
Done()が欠落している場合、mochaはタイムアウトまで「done()」を待機するため、タイムアウト例外が発生します。