用mocha.jsjoin多个文件的testing

我试图从一个文件中的多个文件中join所有的testing,如下所示:

describe('Controllers', function() { describe('messages.js', function() { require('./controllertests/messages').test(options); }) describe('users.js', function() { require('./controllertests/users').test(options); }) }) 

我很确定这不是jointesting的最好方法,我有一些难题find如何做到这一点的例子:

如果你想在你的问题中包含多个模块你的describe层次结构中,那么你所做的就是非常多,除非你想为Mocha编写一个定制的testing加载器。 编写自定义加载器不会更容易,或者使您的代码比您已经拥有的更清晰。

这里有一个例子,我将如何改变一些事情。 这个例子中的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函数只是为了展示如何处理重复导入多个模块而不必重新input整个describe(... require...每次都describe(... require...事情)。 common模块是为了容纳你需要的东西在testing套件的多个模块中使用,实际上我并没有使用它,但如果需要的话,可以在那里使用它。

在这里我会注意到beforeEach将在每一个单独的testing之前运行它的代码it无论它们出现在topdescribe中,还是出现在任何一个导入的模块中 。 使用--recursivebeforeEach代码将被复制到每个模块中,或者每个模块中都有一个beforeEach钩子,用于调用从公共模块导入的函数。

此外, after钩将在套件中的所有testingafter运行。 这不能复制 – --recursive 。 如果使用--recursive并将after的代码添加到每个模块,则每个模块将执行一次,而不是整个testing一次。

让所有testing显示在单个top标题下,不能使用--recursive复制。 用 – --recursive每个文件都可以describe("top"但这会为每个文件创build一个新的top标题。

common.js

 var chai = require("chai"); var options = { foo: "foo" }; exports.options = options; exports.chai = chai; exports.assert = chai.assert; 

像这样使用一个名为common模块是我在我的一些testing套件中完成的,以避免反复require一堆东​​西,并保存全局只读variables或不保持状态的函数。 我不喜欢像thgaskell的答案那样污染global对象,因为这个对象是真正的全局的,即使在你的代码可能正在加载的第三方库中也是可以访问的。 这不是我在代码中可以接受的东西。

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 () {}); 

没有什么能够阻止你运行多个testing文件。 一般来说,每个testing不应该依赖于另一个testing的结果,所以共享variables不是你想做的事情。

这里有一个如何组织你的testing文件的例子。

 . ├── app.js └── test ├── common.js ├── mocha.opts │ ├── controllers │  ├── messages-controller.js │  └── users-controller.js │ └── modles ├── messages-model.js └── users-model.js 

然后在你的mocha.opts文件中,确保设置--recursive选项。

mocha.opts

 --ui bdd --recursive 

如果您想在所有文件中包含通用模块,则可以将其添加到common.js文件中。 test目录根目录下的文件将在嵌套目录中的文件之前运行。

common.js

 global.chai = require('chai'); global.assert = chai.assert; global.expect = chai.expect; chai.should(); chai.config.includeStack = true; process.env.NODE_ENV = 'test'; // Include common modules from your application that will be used among multiple test suites. global.myModule = require('../app/myModule'); 

虽然这可能与问题没有直接关系,但我所寻找的答案是:

 $ mocha --recursive 

将在“testing”文件夹的子目录中执行所有testing。 整齐。 保存必须保持我想要加载的testing列表,实际上只是运行一切。

 describe( 'Running automation test, Please wait for all test to complete!'.red, function () { var run = require( './Test.js' ); for ( var i = 0; i < 2; i++ ) { run.badLogin(); run.loginLimited(); run.acceptJob(); run.drivingToJob(); run.arrivedAtJob(); run.towingJob(); run.arrivedDestination(); run.jobComplete(); run.restrictionLicensePlate(); run.newNodeMainMenu(); run.newNodeMainMenuToDrafts(); run.draftDelete(); run.resetAllData(); run.companyVehicle(); run.actionsScreenClockInOut(); run.mainMenuLogout(); run.loginAdmin(); run.actionsScreenLogout(); } } );