18

我最近开始使用 mocha 来测试我的 expressjs 服务器。我的测试被分成多个文件,其中大多数包含一些重复的段(主要是在将所有固定装置加载到数据库的语句之前,等等),这真的很烦人。

我想我可以将它们全部导出到一个文件并在每个测试中导入它们,但我想知道是否有一些更优雅的解决方案 - 例如运行具有所有设置命令的某个文件,以及另一个包含所有设置命令的文件拆卸命令。

如果有人知道答案会很棒:)

4

2 回答 2

21

mocha 测试的常用功能分为三个基本级别。如果您想为一堆测试加载一次固定装置(并且您已将每个测试编写为独立的),请使用该before函数在文件顶部加载固定装置。beforeEach如果您每次都需要重新初始化灯具,您也可以使用函数。

第二个选项(相关)是将通用功能提取到单独的文件或文件集并需要该文件。

最后,请注意 mocha 有一个根级别的钩子

您还可以选择任何文件并添加“根”级挂钩。例如,在所有 describe() 块之外添加 beforeEach()。这将导致对 beforeEach() 的回调在任何测试用例之前运行,无论它位于哪个文件中(这是因为 Mocha 有一个隐含的 describe() 块,称为“根套件”)。

我们使用它来启动 Express 服务器一次(并且我们使用环境变量,以便它在与我们的开发服务器不同的端口上运行):

before(function () {
  process.env.NODE_ENV = 'test';
  require('../../app.js');
});

(我们done()这里不需要,因为 require 是同步的。)也就是说,服务器只启动一次,不管有多少不同的测试文件包含这个根级before函数。

以这种方式拆分的好处是我们可以运行npm testwhich 运行所有测试,或者在任何特定文件或任何特定文件夹,或任何特定测试或一组测试上运行 mocha(使用 it.only 和 describe.only)和所选测试的所有先决条件都将运行。

于 2013-09-07T16:00:37.897 回答
12

为什么不mocha -r <module>甚至使用mocha.opts

比如说,把你的公用文件放进去,init.js然后运行

mocha -r `./init`

这将导致 mocha./init.js在加载任何 mocha 测试文件之前运行和加载。

你也可以把它mocha.opts放在你的测试目录中,并让它的内容是

--require ./init
于 2013-09-08T07:04:40.163 回答