用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
无论它们出现在top
的describe
中,还是出现在任何一个导入的模块中 。 使用--recursive
, beforeEach
代码将被复制到每个模块中,或者每个模块中都有一个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(); } } );