【发布时间】:2013-09-06 09:35:18
【问题描述】:
我最近开始使用 mocha 来测试我的 expressjs 服务器。 我的测试被分成多个文件,其中大多数包含一些重复的段(主要是在将所有固定装置加载到数据库的语句之前等),这真的很烦人。
我想我可以将它们全部导出到一个文件并在每个测试中导入它们,但我想知道是否有一些更优雅的解决方案 - 例如运行具有所有设置命令的某个文件,以及另一个包含所有设置命令的文件拆卸命令。
如果有人知道答案会很棒:)
【问题讨论】:
我最近开始使用 mocha 来测试我的 expressjs 服务器。 我的测试被分成多个文件,其中大多数包含一些重复的段(主要是在将所有固定装置加载到数据库的语句之前等),这真的很烦人。
我想我可以将它们全部导出到一个文件并在每个测试中导入它们,但我想知道是否有一些更优雅的解决方案 - 例如运行具有所有设置命令的某个文件,以及另一个包含所有设置命令的文件拆卸命令。
如果有人知道答案会很棒:)
【问题讨论】:
mocha 测试的常用功能分解为三个基本级别。如果您想为一堆测试加载一次固定装置(并且您已将每个测试编写为独立的),请使用before 函数在文件顶部加载固定装置。如果您每次都需要重新初始化灯具,也可以使用beforeEach 函数。
第二个选项(相关)是将通用功能提取到一个单独的文件或一组文件中并需要该文件。
最后,请注意 mocha 有一个root level hook:
您也可以选择任何文件并添加“根”级挂钩。例如,在所有 describe() 块之外添加 beforeEach()。这将导致 beforeEach() 的回调在任何测试用例之前运行,无论它位于哪个文件中(这是因为 Mocha 有一个隐含的 describe() 块,称为“根套件”)。
我们使用它来启动 Express 服务器一次(并且我们使用环境变量,以便它在与我们的开发服务器不同的端口上运行):
before(function () {
process.env.NODE_ENV = 'test';
require('../../app.js');
});
(这里我们不需要done(),因为require 是同步的。)也就是说,服务器只启动一次,不管有多少不同的测试文件包含这个根级别的before 函数。
以这种方式拆分的好处是我们可以运行 npm test 来运行所有测试,或者在任何特定文件或任何特定文件夹,或任何特定测试或一组测试上运行 mocha(使用 it.only和 describe.only) 并且所选测试的所有先决条件都将运行。
【讨论】:
test/ 文件夹都有一个根级before(){debugger;},这样我就可以使用debug-brk 启动,并且知道它会在所有内容加载完毕但运行之前停止
before() 时会引发错误ReferenceError: before is not defined 你知道可能是什么问题吗?
为什么不用mocha -r <module> 甚至使用mocha.opts?
将你的公用文件放在init.js 中,然后运行
mocha -r `./init`
这将导致 mocha 在加载任何 mocha 测试文件之前运行并加载 ./init.js。
你也可以把它放在你的tests目录下的mocha.opts,并让它的内容是
--require ./init
【讨论】: