2013-07-26 12 views
7

私はノードAPIのテストを書くためにMochaを使用しています。 1つのテストでは、2つのアクションを実行し、それぞれのタイムスタンプを比較して、それらが異なることを確認する必要があります。そのためには、少なくとも1秒間、テスト実行を確実に一時停止する必要があります。私はを使用して、pingへの2回目のコールの前にモカの実行を一時停止しようとしていましたが、それは起こっていません。setTimeout()を使用してMochaテストを一時停止します

it('should insert then update the timestamp.', function(done) { 
    Do.ping('arg1', function(err, result) { 
    should.not.exist(err); 

    setTimeout(Do.ping('arg1', function(err, result) { 
     // Test that the timestamp of the first ping is before the timestamp 
     // of the second ping (among other things) 
     done(); 
    }), 1000); 
    }); 
}); 

誰でも私がここで骨抜きにしたものを見てください。あるいは、私がやろうとしていることを行うためのより良い(つまり、よりモカ・イッシュな)方法がありますか?

答えて

2

私はSinonの偽のタイマーAPIを使用してしまいました。偽のタイマーをインスタンス化して、それぞれbeforeEach()afterEach()にリセットします。私はnpm install sleepforを使用してsleepforパッケージを追加しました

clock.tick(180000); // Advances the JS clock 3 minutes (180 seconds) 
0

は私が(未テスト)の代替を提案してみましょう:

var async = require('async') 
it('should insert then update the timestamp.', function(done) { 
    async.series([ 
    Do.ping('arg1', function(err, result) { 
    should.not.exist(err); 
    }, 
    setTimeout(console.log('waiting'),1000); 
    }, 
    Do.ping('arg2', function(err, result) { 
    should.not.exist(err); 
    }, 
    done();] 
    }); 
}); 

私はasync.seriesを使って、あなたがより確実に2回目の呼び出しになってからモカを一時停止することができると思います。

+0

ありがとうございました。私はJS時計を操作するためにsinonパッケージを試してきましたが、これまでのところうまくいきました。 –

0

:実際の試験の中で、あなたが必要とするどのような方法で時計を進めます。私のテストでは、私は次のようしている:

const sleepfor = require('sleepfor'); 

describe('My Test', function() { 
    it('should test something here.', function(){ 
     // Run some test code here. 
    }); 
    it('should test something ELSE here.', function(){ 
     // Run different test code here. 
    }); 

    afterEach(function(){ 
     var d = new Date(); 
     console.log(d.toLocaleString() + " >> Before sleep."); 
     sleepfor(5000); 

     var d = new Date(); 
     console.log(d.toLocaleString() + " >> After sleep."); 
    }); 
}); 

は明白であるはずですが、念のために、afterEachは、あなたのITブロックの実行の各後に呼び出されます。

+0

[受け入れられた回答](https://stackoverflow.com/a/18000251/1906307)のメソッドを使用する方が、 'sleepfor'のようなものを使用する方がはるかに優れています。各テストは*必ず*実行するのに少なくとも5秒かかります。スイートにテストを追加するとすぐに分を費やしています。さて、クロックを操作して同じテストを行い、テストにはミリ秒かかるでしょう。さらに、 'sleepfor'は本当に「スリープ」しません。あなたが求めるインターバルの間にループを実行します。だからあなたのプロセスはその時間中にあなたのCPUを食べるでしょう:資源の無駄です!再び、クロックを操作することでこの問題は回避されます。 – Louis

+0

うん、私は疑問を誤解した。私は、この質問を、テストの間にどのように休止/睡眠するかを調べることから始めました。私は私の場合、最終的に 'browser.pause(...)'だけを使って終了したと付け加えます。私にはうまく対応しましたが、@Louisが指摘しているように、この質問に対する答えではありません。 –

関連する問題