如果你想包含多个模块到您的describe
层次结构就像你在你的问题做什么,你在做什么是相当多的它,除非你想要写摩卡自定义测试装载机。编写自定义加载程序将不会比现在更容易,或者使您的代码更清晰。
这是我将如何更改一些事情的示例。test
本示例中的子目录组织为:
.
└── test
├── a
│ └── a.js
├── b
│ └── b.js
├── common.js
└── top.js
top.js
:
function importTest(name, path) {
describe(name, function () {
require(path);
});
}
var common = require("./common");
describe("top", function () {
beforeEach(function () {
console.log("running something before each test");
});
importTest("a", './a/a');
importTest("b", './b/b');
after(function () {
console.log("after all tests");
});
});
该importTest
功能只是说明如何处理导入多个模块的重复而不必describe(... require...
每次都重新键入整个内容。该common
模块旨在容纳您需要在测试套件的多个模块中使用的模块。我实际上并没有在使用它top
但是如果需要的话,可以在这里。
我将在此处指出,beforeEach
在每次注册的每个测试之前,它将运行其代码,it
无论它们出现在describe
in中top
还是出现在任何导入的模块中。使用--recursive
,必须将beforeEach
代码复制到每个模块中,或者每个模块中都有一个beforeEach
挂钩,以调用从公共模块导入的函数。
同样,该after
挂钩将在套件中的所有测试之后运行。无法使用复制--recursive
。如果您使用--recursive
并将代码添加after
到每个模块,则每个模块将执行一次,而不是整个模块执行一次测试。
top
使用不能复制所有测试出现在单个标题下的内容--recursive
。随着--recursive
每个文件可以有describe("top"
,但是这将创建一个新的top
为每个文件标题。
common.js
:
var chai = require("chai");
var options = {
foo: "foo"
};
exports.options = options;
exports.chai = chai;
exports.assert = chai.assert;
在某些测试套件中,我使用了这样的模块,以common
避免重复执行require
一堆操作,并保留不保持状态的全局只读变量或函数。我不想污染global
想像thgaskell的回答那样对象,因为该对象是真正的全局对象,即使在您的代码可能正在加载的第三方库中也可以访问。我在代码中发现这不是可接受的。
a/a.js
:
var common = require("../common");
var options = common.options;
var assert = common.assert;
it("blah a", function () {
console.log(options.foo);
assert.isTrue(false);
});
b/b.js
:
it("blah b", function () {});