2014-04-09 73 views
1

相同的文件我有config/index.js返回根据所设定的NODE_ENV环境变量不同的配置文件。如何要求摩卡测试

我试图写一个简单的测试,以确保正确的配置返回为每个环境,但我遇到了一个问题,只有第一个要求实际上是被调用,后续需要同样的文件被使用第一个要求的值。

我应该如何更改我的测试来解决此问题?

describe('config', function() { 

    it('should return dev config', function (done) { 
    process.env.NODE_ENV = 'development'; 
    var config = require(__dirname + '/../../config'); // development config 

    console.log(config.plugins.ipFilter); 
    done(); 
    }); 

    it('should return prod config', function (done) { 
    process.env.NODE_ENV = 'production'; 

    // development config from above. 
    // the require here doesn't actually get invoked 
    var config = require(__dirname + '/../../config'); 

    console.log(config.plugins.ipFilter); 
    done(); 
    }); 
}); 

这里是config/index.js一个简化版本(这是很好的工作),我试图测试一下:

var Hoek = require('hoek'); 

var settings = { 
    'defaults':  require('./settings/defaults'), 
    'production': require('./settings/production') 
}; 

var env; 
switch (process.env.NODE_ENV) { 
    case 'production': env = 'production'; break; 
    case 'development': env = 'development'; break; 
    default:   env = 'defaults';  break; 
} 

var config = Hoek.applyToDefaults(settings['defaults'], settings[env]); 
module.exports = config; 

回答

5

我会运行2日前删除节点的模块,缓存模块测试:

var resolved = require.resolve(__dirname + '/../../config'); 
delete require.cache[resolved]; 

所以当再次需要时,Node会从头开始加载。请注意,上面的代码只会从缓存中删除config模块。如果您需要删除由require电话config模块加载的模块,那么你就必须做到上面一样为他们每个人也。

顺便说一句,如果你的测试将要成为异步的,你需要的done回调喜欢你目前有。如果您的测试目前保持同步,您可以从您给it的回调的参数列表中删除done,并省略调用它。

+0

require.resolve为您提供文件的路径。在通过路径删除缓存之前,您仍然需要(已解决)。我建议为未来的读者添加。谢谢你的帮助。 – doremi