在每次测试之前在 mocha 套件中设置变量?

Tim*_*Tim 3 javascript mocha.js

我想在执行测试之前先设置一些变量,我找到了这个解决方案,在每个套件之前而不是在每个测试之前运行 Mocha 设置

但是,我不知道如何将变量传递到我的回调中,他们这样做我会得到未定义

makeSuite('hello', (context) => {
    it('should return', () => {
        assert.strictEqual(1, 1)
    })
})
makeSuite('world', (context) => {
    it('should return', () => {
        console.log(context) // undefined
        assert.strictEqual(1, 1)
    })
})

function makeSuite(name: string, cb: (context: any) => any) {
    let age: string;
    describe(name, () => {
        beforeEach(() => {
            age = '123'
        })

        cb(age);
    })
}
Run Code Online (Sandbox Code Playgroud)

我想将变量传递给回调的原因是,我将有许多需要在beforeEach钩子上设置的私有变量,而且我不想为所有测试重复我的代码。

Lou*_*uis 7

传递给的回调describe会立即调用,但稍后在测试执行时beforeEach调用您的钩子。所以 when被调用,has for value 。稍后设置为但之前已经获得了该值的副本,因此它无效。为了看到更改,您必须传递对对象的引用,然后对其进行变异。像这样的东西:cb(age)ageundefinedage"123"cbcb

makeSuite('world', (context) => {
    it('should return', () => {
        console.log(context.age)
    })
})

function makeSuite(name, cb) {
    describe(name, () => {
        let context = {
            age: undefined,
        };
        beforeEach(() => {
            context.age = '123';
        });

        cb(context);
    });
}
Run Code Online (Sandbox Code Playgroud)

(我已经删除了 TypeScript 类型注释,以便它作为纯 JavaScript 运行。无论如何,注释对于解决问题并不重要。)