如何在 MochaJS 的 before hook 中 运行 异步函数?

How to run async functions in before hook in MochaJS?

我尝试在 hook 之前在我的 mocha JS 中调用很多异步函数,但它们最终都被执行了。基本上我正在尝试使用构造函数初始化中的不同参数执行重复测试。

我只尝试了一个函数,但它也在 last.Tried 处执行以将 done() 函数传递给内部异步函数,但它也无济于事。

a.test.js 和 base.tests.js 个文件:

describe('Test block', () => {
    before((done) => {
            const baseClass = new baseClass()
            baseTests.applyTests(done)
        });
    describe('test',()=>{
    ....first which should be executed;
    })
}
----------------------------------------------------------------
class baseClass {

    constructor() {
        init smth....
    }

    async applyTests(done) {
        await Promise.All(
        [
            a(),
            b(),
            c()
        ]
        done();
        )
    }
    async a() {
        return describe('TEST', () => {
            it('TEST', (done) => {
                chai.request(server)
                    .get(url)
                    .end((err, res) => {
                        asserts...
                        done();
                    });
            });
        }}

我希望 运行 首先是 before 挂钩中的异步操作,然后是所有其他测试。

请记住 describeit 块不执行任何测试;他们将测试添加到 Mocha 将执行的 测试列表 中。把一个 describe 块放在一个从 before 钩子调用的函数中,这样不会最终执行像 chai.request(... 等代码。 运行 在每次测试之前,你不想在那里做断言,因为它不会链接到任何特定的单元测试。)

我不能给出更具体的建议,因为我不确定你想要完成什么,但一般来说,你的 describeit 块应该是 top-level构造而不是像这样放入其他代码。

编辑:只是为了使这里的执行路径清晰:你的 before hook 运行s,它调用 applyTests,它调用 a(),它执行一个描述块并添加你的单元测试 TEST 到测试列表,然后它 returns。然后它开始 运行ning 测试,包括 testTEST

编辑:啊,有道理,让我推荐两种在单元测试中经常使用的模式。

模式一:"Test Loop"

此模式创建许多 similar-looking 测试,使用输入参数数组生成适当的测试描述和测试主体。

[
    { foo: "milk", bar: "smoothie" },
    { foo: "yogurt", bar: "fridge" },
    { foo: "whatever", bar: "container" }
].forEach(test => {
    it("puts the " + test.foo + " in the " + test.bar, function () {
        assert(subject.someMethod(foo) === bar);
    });
});

模式二:"Test Helper"

此模式创建单独的测试,但将公共测试 body 放在辅助方法中,以便可以重复使用。

function testSomeMethod(foo, bar) {
    assert(subject(foo) == "bar");
}

it("puts the milk in the fridge", function () {
    testSomeMethod("milk", "fridge");
});

it("puts the cereal in the pantry", function () {
    testSomeMethod("cereal", "pantry");
});

上面的例子很简单,但是无论是测试循环还是测试助手模式都可以用来封装更复杂的一系列步骤(设置一个请求,看看一些响应 headers / bodys等)。