如何使用mocha分解常见的before()调用?

Wil*_*hes 3 mocha.js node.js

我的mocha测试中有很多重复:

describe("Some test", function() {
    before(helpers.testPrepare);
    beforeEach(helpers.freshDB);

    it("should foo", function(done) {
        //...
        done();
    });

    after(helpers.teardownServer);
});

describe("Another test", function() {
    before(helpers.testPrepare);
    beforeEach(helpers.freshDB);

    it("should bar", function(done) {
        //...
        done();
    });

    after(helpers.teardownServer);
});
Run Code Online (Sandbox Code Playgroud)

如果我忘记打电话beforeEach,这可能会导致问题,重构很痛苦.我想定义一个describe确保我总是调用我的设置和拆解,所以我可以写:

我想把它写成:

var describe = require('./helpers').describe;

describe("Some test", function() {
    it("should foo", function(done) {
        //...
        done();
    });
});
Run Code Online (Sandbox Code Playgroud)

我怎么能这样做,因为摩卡定义describe为全球?如何确保一切按正确的顺序执行?

Lou*_*uis 6

我会创建一个helpers.js包含以下内容的文件:

function beforeEachExample() { console.log("before each"); }

function beforeExample() { console.log("before"); }

function afterExample() { console.log("after"); }

function makeSuite(desc, cb) {
    describe(desc, function () {
        before(beforeExample);
        beforeEach(beforeEachExample);

        cb();

        after(afterExample);
    });
}

exports.makeSuite = makeSuite;
Run Code Online (Sandbox Code Playgroud)

然后我可以test/something.js:

var makeSuite = require("../helpers").makeSuite;

makeSuite("something", function () {
    it("one", function () {});
    it("two", function () {});
});
Run Code Online (Sandbox Code Playgroud)

而且test/somethingelse.js:

var makeSuite = require("../helpers").makeSuite;

makeSuite("something else", function () {
    it("one", function () {});
    it("two", function () {});
});
Run Code Online (Sandbox Code Playgroud)

运行上面的设置给出:

$ mocha

  something
before
before each
    ? one 
before each
    ? two 
after

  something else
before
before each
    ? one 
before each
    ? two 
after

  4 passing (5ms)
Run Code Online (Sandbox Code Playgroud)