如何不在 mocha 中重复测试

How not to repeat myself with duplicate tests in mocha

这是我的 test.js 文件,我试图在 duplicateTests 函数中进行一些测试,并在不同的测试文件中使用此函数:

function duplicateTests(user) {
    it('nested test 2', done => {
        console.log('user in duplicateTests function: ', user)

        if (user) {
            done()
        } else {
            done(new Error('Dummy error'))
        }
    })
}

describe('users', () => {
    let user

    before(async () => {
        user = await models.User.create({
            name: 'john',
        })
    })

    describe('TEST THE BEFORE HOOK', () => {
        it('test 1', done => {
            console.log('user: ', user)

            if(user) {
                done()
            } else {
                done(new Error('Dummy error'))
            }
        })

        duplicateTests(user)
    })
})

'test 1' 中的日志正确记录了用户:
user: { name: 'john' }

但是 'nested test 2' 中的日志记录了这个:
user in duplicateTests function: undefiend

所以 user 在嵌套测试中是 undefined 并且嵌套测试如您所料失败。

我尝试在我的 'before' 钩子中返回一个承诺,但这并没有解决问题。
感谢您提供的任何帮助。

发生这种情况是因为 duplicateTests()before() 完成之前运行。

describe('users', async () => {
    let user

    user = await models.User.create({
        name: 'john',
    })

    describe('TEST THE BEFORE HOOK', () => {
        it('test 1', done => {
            console.log('user: ', user)

            if(user) {
                done()
            } else {
                done(new Error('Dummy error'))
            }
        })

        duplicateTests(user)
    })
})

或者您可以利用 javascript 的对象引用:

function duplicateTests(context) {
    // let user = context.user doesnt work here
    // because before() has not run yet.

    it('nested test 2', done => {
        // reference is collapsed
        // we can be sure before() was called because
        // it is ran before any tests run
        let user = context.user

        console.log('user in duplicateTests function: ', user)

        if (user) {
            done()
        } else {
            done(new Error('Dummy error'))
        }
    })
}

describe('users', () => {
    let context = {}

    before(() => new Promise(async (resolve, reject) => {
        try {
            context.user = await models.User.create({
                name: 'john',
            })
            resolve()
        } catch (err) {
            reject(err)
        }
    }))

    describe('TEST THE BEFORE HOOK', () => {
        it('test 1', done => {
            console.log('user: ', context.user)

            if(context.user) {
                done()
            } else {
                done(new Error('Dummy error'))
            }
        })

        // context is passed by reference
        duplicateTests(context)
    })
})