不引人注意的节点测试

时间:2012-10-25 23:32:32

标签: node.js tdd bdd mocha

所以,我刚接触js测试,我正在尝试使用mocha来测试节点应用程序。

理想情况下,我想拥有它,以便测试位于单独的文件中并在节点脚本本身上运行(可能通过在测试脚本的顶部使用require调用)。目前我正在做一些我知道不可能正确的事情,即将测试包含在脚本文件底部的块中。这是测试代码包含在生产代码中的问题,以及当您尝试启动节点服务器时,它的“描述未返回”这一事实。

我已经阅读了很多关于mocha等的教程,看起来你可以通过'module.export。'单独导出你的所有方法,但这看起来很昂贵而且也是突兀的。

我在这里缺少什么?当然你不必构造两个脚本(一个有一个脚本,一个没有测试代码?) - 最终会出现版本问题。

如何做得最好(文章的链接也非常感谢。)

由于

詹姆斯

2 个答案:

答案 0 :(得分:3)

所以这就是我看到人们在做的事情,以及我在自己的工作中采用的方法:

  1. 在您的模块中,仅导出需要导出的值。就个人而言,我试图限制自己只能输出一个函数,但这是一个单独的讨论。
  2. 创建一个test目录并将所有测试用例放入其中。使用您喜欢的任何命名约定。我更喜欢每个源模块都有一个测试文件。在每个文件的开头,只需要测试模块。
  3. 使用--recursive参数从Makefile / Cakefile调用mocha,以便它知道检查test目录的全部内容。
  4. 这意味着您正在通过其接口测试模块,就像在普通代码中使用它们一样。缺点是,如果您的非导出函数具有难以通过模块界面命中的执行路径,您可能会发现自己有点沮丧。

    一方面,我同意模块应该在使用时进行测试的观点。另一方面,我认为我晚上睡得更好,知道我直接测试了上述每一个棘手的执行路径。在做node.js编程之前,我花了几年时间编写了erlang代码,它具有完全相反的约定:(测试放在源文件的末尾,这样它们就可以直接访问模块中的每个函数,并且测试包含/导出由ifdef指令处理)。就个人而言,我更喜欢erlang方法。

    无论如何,我希望这很有帮助。如果读到这篇文章的人有相反的强烈意见,我很乐意听到。

答案 1 :(得分:3)

我同意David Weldon的帖子,但我想补充一些例子。

您应该正常编写Node模块。如果我正在编写可能在代码的其他部分使用的计算器,那么我的计算器模块可能如下所示:

Calculator = {
  add: function(a, b) {
    return a + b;
  }
};

module.exports = Calculator;

你提到使用module.exports似乎代价高昂而且突兀。你可以做几件事。 module.exports是在其他文件中访问代码的最佳和推荐方法。为简单起见,您可以像在计算器中一样将函数和变量包装在对象中,并只导出一个对象。

请注意,有两种方法可以使用" exports"。你可以这样做:

var a = function() { ... };
var b = 10;
var c = null;

exports.a = a;
exports.b = b;
exports.c = c;

这会为模块的特殊exports对象添加内容。或者你可以这样做:

objectToExport = {
  a: function() { ... },
  b: 10,
  c: null
};

module.exports = objectToExport;

替换 exports对象。如果您执行exports = objectToExport它将无法正常工作,当您尝试在另一个文件中require模块时,您最终会得到一个空对象。

当我使用Mocha进行测试时,我将所有测试文件放在test目录中,该目录反映了我的代码目录的结构。

project
  +- lib
   +- calculator.js
  +- test
   +- lib
    +- calculator.js

我的test / lib / calculator.js文件是我对lib / calculator.js文件的Mocha测试

var Calculator = require('../../lib/calculator.js');
var assert = require('assert');

describe('Calculator', function() {
  describe('add', function() {
    it('should add two numbers', function() {
      var res = Calculator.add(2,2);
      assert.equal(res, 4);
    });
  });
});

默认情况下,mocha将在您运行mocha的目录中查找/test目录。如果您有上述示例中的子目录,则可以在命令行中添加--recursive以查找所有测试。因此,如果您在命令上方的project目录中运行,则mocha --recursive