child_process execを使用するモジュールを使用するユニットテストコードにいくつか問題があります。 execコールの中または後にアサートを使用する単体テストを作成すると、Mochaが正しく動作しません。アサートがトリガされると、Mochaは指定されたタイムアウトに達するまで実行を継続します。アサーションがトリガされていないときは、すべて正常に動作します。child_process execを使用しているときにmochaでアサートが機能しない
たとえば、このテストケースではモカは、タイムアウトに達するまで実行されます:
it('someTest', function (done) {
var exec = require('child_process').exec;
exec('ping 8.8.8.8',() => {
assert.deepEqual(1, 2, 'test');
done();
});
});
そして同じ問題が依然として計上アサートがEXEC外にある場合:
it('someTest2', function (done) {
var exec = require('child_process').exec;
var promise = new Promise((promiseDone) => {
exec('ping 8.8.8.8',() => {
var success = 1 === 2;
promiseDone(success, '1 has to be 2');
});
});
promise.then((success, message) => {
assert.deepEqual(success, true, message); // Assert stops the test but Mocha does not stop
done();
});
});
問題を回避するためこの問題は、execを使用して結果を保存するメソッドを実行するbefore文を作成してからit()を作成することです。ブロックを使用して、その結果をアサーションでチェックします。
これは適切な解決策ではありません。このアプローチでは、前のステートメントで単体テストを行い、後でit()の結果をチェックします。ブロック。それは正しいことではありません。
例:
var success = true;
before(function (done) {
this.timeout(10000);
var exec = require('child_process').exec;
exec('ping 8.8.8.8',() => {
success = 1 === 2;
done();
});
});
it('someTest1', function (done) {
assert.deepEqual(success, true, 'test');
done();
});
私はWindows上でテストを実行しました。 Pingは4回の試行後に停止します。ただし、テストのデフォルトの時間制限は2秒で、pingコマンドはそれより長く続きます。あなたは100%正しいです!ありがとうございました! (Pingは確かにプレースホルダーでした) – Laurence
私はWindowのpingがその動作を持つことに気付きませんでした。コメントありがとう。私は将来の読者に役立つように私の答えを編集しました。 – Louis