2016-06-15 11 views
2

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(); 
}); 

答えて

3

あなたpingコマンドは、2秒以上かかります。私はWindowsに精通しているわけではありませんが、pingがデフォルトで行う試みは2秒以上かかります。だからタイムアウトを増やすことが一つの解決策です。

* nixシステムでは、通常Ctrl + Cを押すまでpingが実行されます。 Debianシステムのmanによれば、pingを先に終了したい場合は、-c [count]を使って送信するパケット数を設定することができます。または-w [deadline]を使用して、期限を設定して終了する必要があります。たとえば、ping -w 1 8.8.8.8はあなたのコードでうまく動作します。 (-W [timeout]は、応答がない場合は、詳細については、マニュアルを参照してくださいあきらめる前に待機する時間をpingを伝えているにもあります。)

あなただけの自分のモカ・テストの構造をテストするために、いくつかのプレースホルダコマンドとしてpingを使用していた場合代わりにecho foo(または同等のものはWindows上にあるもの)を使用することも、すぐに終了する単純なものを使用することもできます。

+1

私はWindows上でテストを実行しました。 Pingは4回の試行後に停止します。ただし、テストのデフォルトの時間制限は2秒で、pingコマンドはそれより長く続きます。あなたは100%正しいです!ありがとうございました! (Pingは確かにプレースホルダーでした) – Laurence

+1

私はWindowのpingがその動作を持つことに気付きませんでした。コメントありがとう。私は将来の読者に役立つように私の答えを編集しました。 – Louis

関連する問題