2016-05-27 20 views
0

tape.jsのテストでは、私のデータベースを変更するファイルが異なります。Node.jsでファイルが順番にテストを実行するのを防ぐ方法を教えてください。

個別に実行すると問題なく動作しますが、tape tests/**/*.jsのようなすべてのファイルを実行すると、2番目のファイルのテストが最初のファイルが終了する前に実行され、データベースの状態が正しくないためテストが失敗します。

非同期呼び出しが完了するのを待っている間にノードがファイルを終了できないようにするにはどうすればよいですか?

どちらも私が動作します持っていたこれらのアイデアのは:

function wait() //blocks forever so the test can never finish 
{ 
    while (!testsFinished) {;} 
} 

function wait() //returns immediately because it uses a timeout 
{ 
    if (!testsFinished) 
     setTimeout(wait, 1000); 
} 

私は考えることができる唯一の他のオプションは、各ファイルを個別に呼び出すためにasync.series([....])を使用して自分自身のテストファイルマネージャを書くことです。しかし、それは私自身のテストランナーフレームワークを作成するホイールを再発明するだろう。

答えて

-1

正直、あなたのユニットテストでは、データベースを変更しないでください。それを正しく実行したい場合は、単体テストからDBを完全に分離する必要があります。

それ以外:あなたのユニットテストは、お互いに影響することなく、いつでも実行できなければなりません。そうでない場合は、良い単体テストがありません。

簡単な方法でテストを実行したり、適切に実行したり、時間をかけてデータベースの依存関係を取り除いたりできます。第2の解決策のみが望ましい。

+0

これは単体テストではありません。これは統合テスト用です。 – Richard

+0

どちらかの方法@marcあなたの答えは質問に答えません –

+0

リチャードは申し訳ありません、質問には言及されていません。 @ jack.the.ripper質問に答えることはbsに伝えることを意味する場合、私は質問に答えるのではなく、代わりに別の回答を使用することをお勧めします。しかし、はい、この場合、私は全く間違っていました。 –

1

制御フローにblue-tapeが必要なように見えますが、2つのテストを1つのテストに加えることができます。そして、それぞれのテスト結果を約束して両方の約束をつなぐことができます。

test("simple test", function(t) { 
    return test1(); 
}); 

test("nested test", function(t) { 
    return test1().then(function() { 
     return test2(); 
    }); 
}); 

あなたにもテープをpomisifyしたい場合は、bluebirdに見てかかることがあります。私はjack.the.ripperとして約束を使用した場合でもモカ

0

のようなテストフレームワーク(より堅牢な)そうでなければ、別のものを使用することができ、それが役に立てば幸い

は、私はファイルがまだ出てしまう、あるいは私が思う示唆します彼のコードが示すように、他のファイルを呼び出す中央のテストファイルマネージャを書く必要があります。 nodejsは、非同期呼び出している間に終了しませんので

tape 'server/tests/integration/webservice/routes/signUpRouteTest.js' | faucet 
tape 'server/tests/integration/webservice/routes/authenticateEmailConfirmRouteTest.js' | faucet 
tape 'server/tests/integration/webservice/routes/authenticateEmailRejecRouteTest.js' | faucet 

:このため

tape 'server/tests/integration/**/*.js' | faucet 

代わりに私が唯一の解決策は、これを交換し、私のスクリプトで個別にテストを呼び出すことだと思いますテストが保留中の場合は、前のテストが完了した後にのみ実行されます。スクリプト内のテストファイルごとに1行があるとすれば、世界の終わりではないと思います...

0

これはおそらく推奨されていませんが、理論的にはノードのグローバルオブジェクトにプロパティを追加できます。

test1。JS

var test = require('tape') ; 
var util = require('util'); 

test('My first test file', function(assert) { 
    assert.equal(1, 1, 'Numbers 1 and 1 are the same') ; 
    assert.equal(2, 2, 'Numbers 2 and 2 are the same') ; 
    assert.equal(3, 3, 'Numbers 3 and 3 are the same') ; 


    myglobalvariableWithoutVarKeyword = 'shared var'; 
    console.log('test1 shared var= ' + util.inspect(myglobalvariableWithoutVarKeyword)); 

    assert.end() ; 
}) ; 

test2.js

var test = require('tape') ; 
var util = require('util'); 

test('My second test file', function(assert) { 
    assert.equal(4, 4, 'Numbers 4 and 4 are the same') ; 
    assert.equal(5, 5, 'Numbers 5 and 5 are the same') ; 
    assert.equal(6, 6, 'Numbers 6 and 6 are the same') ; 


    console.log('test2 shared var= ' + util.inspect(myglobalvariableWithoutVarKeyword)); 
    assert.end() ; 
}) ; 

出力:あなたは共有変数は、すべてのテストをロードしているかどうかをテストした後、アサートを実行することができ、このアプローチでは

My first test file 

    √ Numbers 1 and 1 are the same 
    √ Numbers 2 and 2 are the same 
    √ Numbers 3 and 3 are the same 
    test1 shared var = 'shared var'; 

    My second test file 

    √ Numbers 1 and 1 are the same 
    √ Numbers 2 and 2 are the same 
    √ Numbers 3 and 3 are the same 
    test2 shared var = 'shared var'; 

を.end()を使用して約束します。

関連する問題