2013-11-27 17 views
1

我有一个node.js库,我已经为BDD设置了mochachai。我还添加了代码覆盖范围istanbul。一切都通过grunt任务运行。更好的方式来动态更改测试代码覆盖率的require语句?

我挣扎了一会儿,终于在基于我的设置在此存储库上的基础上工作后,我终于找到了它:https://github.com/morkai/h5.buffers。它的工作原理,但我不喜欢的实施。

grunt-istanbul插件处理文件,设置环境变量,并且测试使用环境变量来查找仪表测试的位置。这是我不喜欢的最后一部分。

//Gruntfile.js 
// ... 
env: { 
    "default": { 
    LIB_FOR_TESTS_DIR: srcLibForTestsDir 
    }, 
    coverage: { 
    LIB_FOR_TESTS_DIR: lcovLibForTestsDir 
    } 
} 
// ... 

然后在测试文件,代码:

var FooClient = require((process.env.LIB_FOR_TESTS_DIR || '../lib') + '/foo-client.js'); 

我还使用在测试中运行测试文件之前所需的所有初始化一个帮手。所以我有两个想法;

  1. 使用测试助手在文件拉动和隐藏的细节有:

    var foo = require('./test-helper.js').foo; 
    var FooClient = foo.FooClient; 
    var ThatOtherThing = foo.ThatOtherThing; 
    
  2. 使用测试运行?我已经看到了这个参考,但是我没有找到关于它和最佳实践的很多信息。

有没有更好的方法?

P.S.如果有人对这个问题有一个更好的标题建议,我愿意接受。

P.P.S.请不要告诉我在你的答案中切换到毛毯。我对两者进行了评估并决定使用istanbul,因为它提供了更多的代码覆盖见解(例如分支)。如果毯子的伊斯坦布尔分支已经完成,那么我会考虑切换。

回答

1

我基本上做了你上面的事情,但将它抽象为一个单独的函数,以便我的测试中的要求可以更清晰/更具可读性。

module.exports = function(path){ 
    return require((process.env.LIB_FOR_TESTS_DIR || '../lib/') + path) 
} 

,因为这意味着你需要要求您的测试一个额外的文件,但它一直工作不够好,对我来说这是不理想的。我的用法结束了看起来有点像这样:

var appRequire = require('./require_helper'), 
    model  = appRequire('models/model') 

我会好奇,看看别人有什么想法。

+0

我喜欢这个解决方案。我将等待一下,看看是否有其他答案。 –

相关问题