2013-12-23 15 views
6

私が使用しているグローバルオブジェクトの周りのモカテストに大きな問題があります。私はまったく同じエラーを出さないが問題のある(バグ?)挙動を例証する次のMREを生成することができます。どんな洞察も高く評価されるだろう。Mocha Global Scoping Issues

私は/libに次のmain.jsファイルを持っている:

exports.exec = function(){ 
    console.log(test); 
} 

が続い/test/test.jsに次の

var should = require('should'); 
var main = require('../lib/main'); 

global.test = {something: 1}; 

describe('normal test', function(){ 
    beforeEach(function(){ 
    global.test = {another: 2}; 
    }), 

    afterEach(function(){ 
    delete global.test; 
    }); 

    it ('might work with global', function(){ 
    main.exec(); 
    }) 
}); 

最後に、これはtest/test2.jsです:

var should = require('should'); 
var main = require('../lib/main'); 

global.test = {third: 3}; 

describe('some test', function(){ 
    it ('messes up global', function(){ 
    main.exec(); 
    }) 
}); 

私がいることを期待します最初のテストは01を出力しますとなり、2番目の文字は{third: 3}と表示されます。確かに、これは私がそれぞれのテストを独立して実行したときの動作です。例えば

[email protected]:~/workspace/mocha-test$ mocha test/test2.js 

    { third: 3 } 
․ 

    1 passing (6ms) 

NPMパッケージshouldmocha(1.16.1)との両方のテストを実行している場合しかし、私は次のような出力が得られます。

[email protected]:~/workspace/mocha-test$ mocha 

    { another: 2 } 
․․ 

    1 passing (6ms) 
    1 failing 

    1) some test messes up global: 
    ReferenceError: test is not defined 
     at Object.exports.exec (/home/jeff/workspace/mocha-test/lib/main.js:3:15) 
     at Context.<anonymous> (/home/jeff/workspace/mocha-test/test/test2.js:8:10) 
     at Test.Runnable.run (/usr/lib/node_modules/mocha/lib/runnable.js:211:32) 
     at Runner.runTest (/usr/lib/node_modules/mocha/lib/runner.js:355:10) 
     at /usr/lib/node_modules/mocha/lib/runner.js:401:12 
     at next (/usr/lib/node_modules/mocha/lib/runner.js:281:14) 
     at /usr/lib/node_modules/mocha/lib/runner.js:290:7 
     at next (/usr/lib/node_modules/mocha/lib/runner.js:234:23) 
     at Object._onImmediate (/usr/lib/node_modules/mocha/lib/runner.js:258:5) 
     at processImmediate [as _immediateCallback] (timers.js:330:15) 
+0

もっと見ると、これは望ましくない動作であると自信を持っています。ここに問題を投稿してください:https://github.com/visionmedia/mocha/issues/1083 –

+1

私もこの問題に遭遇しました。私は、単純なforループで各テストを独立して実行する簡単なファイルを作るのが最善だと思います。 –

+0

あなたの問題はおそらく閉鎖されるでしょう - 私はそれに類似した問題があったと思います。ユーザーは、要求キャッシュを消去したがっていました。 https://github.com/visionmedia/mocha/issues/536 –

答えて

9

test2.jsは、このような構造にする必要があります。

describe('some test', function(){ 
    before(function(){ 
    global.test = {third: 3}; 
    }); 

    it ('messes up global', function(){ 
    main.exec(); 
    }) 
}); 

コメントに記載されているGitHubの問題については、

mochaがファイルを読み込んだ後、スイートを実行することで、セットアップがスイート内に確実に設定されます。

@SBが指摘しているように、これはテスト全体でグローバル変数のようなものを共有することはできません。

+0

テストランナーフレームワークは、before-test-afterを繰り返し呼び出します。グローバル状態は、最初はすべて初期化され、何らかの形でラップされず、各テストで実行されます。グローバル状態がテストの副作用として変更された場合、これらの副作用は後続のテストで確認されます。 –

+0

これは大きなポイントです。テストを別のスコープに分けて、今すぐ動作します。ありがとう! –

+0

通常、テストクラスの前にいくつかのパッケージが必要です。グローバル変数に触れる必要がある場合は、この解決策では問題は解決しません。 –