如何在Mocha异步单元测试中使用afterEach?

时间:2018-09-03 15:26:22

标签: javascript unit-testing asynchronous mocha

在下面的代码中,在测试中的承诺被解决之前,在{em>之前被称为afterEach(),并且被称为done()。我希望它在使用done()完成测试之后才能运行。正确的方法是什么?

describe ("Some test", ()=>{
    afterEach(()=>{
        console.log("Done")
    })

    it("Does something", done=>{
        new Promise (resolve=>{
            let result = doSomething();
            assert.isOK(result);
            done();
        })
    })
})

2 个答案:

答案 0 :(得分:2)

那不是您在Mocha中使用Promises的方式。

Mocha仅通过返回Promise(不需要done())或通过使用async函数作为测试(隐式返回Promise)来支持异步测试,如下所示:

describe ("Some test", ()=>{
    afterEach(()=>{
        console.log("Done")
    })

    it("Does something", async () => {
        const result = await someAsyncFunction();
        assert.isOK(result);
        // no need to return from this one, async functions always return a Promise.
    })
})

describe ("Some test", ()=>{
    afterEach(()=>{
        console.log("Done")
    })

    it("Does something", done=>{
        // note the return
        return new Promise (resolve=>{
          doSomethingWithCallback(result => {
            assert.isOK(result);
            resolve(result);
          });
        })
    })
})

请注意,在非低级代码中使用new Promise()构造函数被视为反模式。有关更多详细信息,请参见此问题:What is the explicit promise construction antipattern and how do I avoid it?

答案 1 :(得分:0)

我猜下面的内容(在整个测试过程中都遵循诺言)可以满足我的要求,但是肯定有更好的方法。

let testPromiseChain = Promise.resolve();

describe("Some test", () => {
    afterEach(() => {
        testPromiseChain
        .then(x=>{
            console.log("Done")
        })

    })

    it("Does something", done => {
        testPromiseChain = testPromiseChain
            .then(() => {
                new Promise(resolve => {
                    let result = doSomething();
                    assert.isOK(result);
                    done();
                })

            })

    })
})