如何在MochaJS的钩子之前运行异步函数?

时间:2018-12-21 13:54:55

标签: node.js asynchronous mocha chai

我尝试在上钩之前在我的Mocha JS中调用许多异步函数,但最后它们会被执行。基本上,我试图从构造函数初始化中使用不同的参数执行重复测试。

我只尝试了一个函数,但最后还是执行了。试图将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钩子之前运行异步操作,然后在所有其他测试之后运行。

1 个答案:

答案 0 :(得分:1)

请记住,describeit块不会执行任何测试;他们将测试添加到Mocha将执行的测试列表中。将describe块放在像这样的before钩子调用的函数中永远不会执行像chai.request(...等这样的代码。(即使这样做,它也会被完全破坏:before钩子是在每次测试之前运行的,因此您不想在其中进行断言,因为它不会链接到任何特定的单元测试。)

由于我不确定您要完成的工作,因此我无法提供更具体的建议,但总的来说,您的describeit块应该是顶级结构,而不应放在在其他这样的代码中。

编辑:只是为了使这里的执行路径清楚:您的前钩子运行,它调用applyTests,后者调用a(),后者执行describe块并添加单元测试TEST返回测试列表,然后返回。然后它将开始运行测试,包括testTEST

编辑:嗯,有道理,让我提出单元测试中经常使用的两种模式。

模式1:“测试循环”

此模式使用输入参数数组来生成许多外观相似的测试,以生成适当的测试描述和测试主体。

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

模式2:“测试助手”

此模式创建单独的测试,但是将通用的测试主体放入辅助方法中,以便可以重复使用。

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");
});

以上示例非常简单,但是可以使用测试循环或测试帮助器模式来封装一系列更为复杂的步骤(设置请求,查看某些响应头/主体等)。 / p>