2013-12-23 76 views
6

我在使用我的全球对象周围的摩卡测试时遇到了大问题。我能够产生下面的MRE,它不会给出完全相同的错误,但是可以举例说明问题(buggy?)行为。任何有识之士将不胜感激。摩卡全球范围界定问题

我有以下main.js文件中/lib

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

我想到的是,第一次测试会输出{another:2}和第二个将打印{third: 3}。事实上,这是我独立运行每个测试时得到的行为。例如

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

    { third: 3 } 
․ 

    1 passing (6ms) 

但是,在运行测试都与故宫包时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

我也遇到过这个问题 - 我认为最好做一个快速的小make文件,每个测试独立运行一个简单的for循环。 –

+0

您的问题可能会被关闭 - 我认为有一个类似的问题。用户希望清除require cache。 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问题上的travisjeffery解释:

摩卡加载文件,然后运行套件,以可靠地设置您的测试设置应该在套件内。

正如@SB指出的那样,这可能不适合跨测试共享全局变量之类的东西。

+0

测试运行器框架反复进行测试前调用。全局状态在开始时全部初始化,不会在每个测试中以某种方式进行包装。如果将全局状态修改为测试的副作用,则在随后的测试中会看到这些副作用。 –

+0

这是一个很好的观点,我将我的测试分为另一个描述范围,现在它可以工作。谢谢! –

+0

我们通常在测试类之前需要一些包,如果这需要在全局变量中触摸,此解决方案不会解决您的问题。 –