在测试中动态更改require语句以获取代码覆盖率的更好方法?

时间:2013-11-27 20:52:46

标签: javascript node.js code-coverage mocha istanbul

我有一个node.js库,我使用mochachai为BDD设置了这个库。我还添加了istanbul的代码覆盖率。一切都通过grunt任务运行。

我挣扎了一段时间,在我将设置基于此存储库后,我终于开始工作了: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. 使用测试跑步者?我已经看到了对此的引用,但我没有找到关于它和最佳实践的更多信息。

  3. 有更好的方法吗?

    P.S。如果有人建议为这个问题提供更好的头衔,我愿意接受他们的想法。

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

1 个答案:

答案 0 :(得分:1)

我基本上完成了你上面的工作,但是把它抽象成一个单独的函数,这样我在测试中的要求可能会更清晰/更易读。

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

这并不理想,因为这意味着您需要在测试中需要额外的文件,但它对我来说已经足够好了。我的用法最终看起来像这样:

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

我很想知道其他人想出了什么。