所以,我刚接触js测试,我正在尝试使用mocha来测试节点应用程序。
理想情况下,我想拥有它,以便测试位于单独的文件中并在节点脚本本身上运行(可能通过在测试脚本的顶部使用require调用)。目前我正在做一些我知道不可能正确的事情,即将测试包含在脚本文件底部的块中。这是测试代码包含在生产代码中的问题,以及当您尝试启动节点服务器时,它的“描述未返回”这一事实。
我已经阅读了很多关于mocha等的教程,看起来你可以通过'module.export。'单独导出你的所有方法,但这看起来很昂贵而且也是突兀的。
我在这里缺少什么?当然你不必构造两个脚本(一个有一个脚本,一个没有测试代码?) - 最终会出现版本问题。
如何做得最好(文章的链接也非常感谢。)
由于
詹姆斯
答案 0 :(得分:3)
所以这就是我看到人们在做的事情,以及我在自己的工作中采用的方法:
test
目录并将所有测试用例放入其中。使用您喜欢的任何命名约定。我更喜欢每个源模块都有一个测试文件。在每个文件的开头,只需要测试模块。--recursive
参数从Makefile / Cakefile调用mocha,以便它知道检查test
目录的全部内容。这意味着您正在通过其接口测试模块,就像在普通代码中使用它们一样。缺点是,如果您的非导出函数具有难以通过模块界面命中的执行路径,您可能会发现自己有点沮丧。
一方面,我同意模块应该在使用时进行测试的观点。另一方面,我认为我晚上睡得更好,知道我直接测试了上述每一个棘手的执行路径。在做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
。