3

所以,我是 js 测试的新手,我正在尝试使用 mocha 来测试节点应用程序。

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

我已经阅读了很多关于 mocha 等的教程,似乎您可以通过执行“module.export.”来单独导出所有方法,但这似乎成本高昂而且也很突兀。

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

这是如何做到最好的(文章链接也被接受了。:)

谢谢

詹姆士

4

2 回答 2

4

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

  1. 在您的模块中,仅导出需要导出的值。就个人而言,我试图限制自己只导出一个函数,但这是一个单独的讨论。
  2. 创建一个test目录并将所有测试用例放入其中。使用您喜欢的任何命名约定。我更喜欢为每个源模块创建一个测试文件。在每个文件的开头,只需要被测模块。
  3. 使用参数从 Makefile/Cakefile 调用 mocha,--recursive以便它知道检查test目录的全部内容。

这意味着您正在通过它们的接口测试模块,就像在普通代码中使用它们一样。缺点是,如果您有执行路径难以通过模块界面访问的非导出函数,您可能会发现自己有点沮丧。

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

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

于 2012-10-26T02:51:01.173 回答
3

我同意 David Weldon 的帖子,但我将添加一些示例。

您应该像往常一样编写 Node 模块。如果我正在编写一个可能在代码的其他部分中使用的计算器,我的计算器模块可能看起来像这样:

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

module.exports = Calculator;

您提到使用module.exports似乎昂贵且突兀。对此,您可以做几件事。module.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 会/test在你运行 mocha 的目录中查找目录。如果您有上面示例中的子目录,您可以添加--recursive到命令行以查找所有测试。因此,如果您在project上面的目录中运行,您的命令将是mocha --recursive.

于 2012-11-02T20:23:44.487 回答