1

我有一个 node.js 库,我已经为 BDD 设置了mochachai。我还使用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. 使用测试运行器?我已经看到了对此的引用,但我没有找到很多关于它和最佳实践的信息。

有没有更好的办法?

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

PPS请不要告诉我在你的回答中切换到毯子。我对两者都进行了评估并决定选择伊斯坦布尔,因为它提供了更多代码覆盖率见解(例如,分支)。如果毯子的伊斯坦布尔分支完成了,那么我会考虑切换。

4

1 回答 1

1

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

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

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

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

我很想看看其他人想出了什么。

于 2013-11-28T16:03:40.227 回答