mocha测试在我的所有测试中是否可以重用相同的before()和after()钩子?

时间:2017-06-10 15:58:27

标签: mocha

我在所有测试中使用相同的before()和after()根级挂钩来设置和清除我的测试数据库... 有没有办法将它们移动到文件中并导出/导入该文件?

1 个答案:

答案 0 :(得分:0)

是。我能够利用mocha的this上下文来实现这种行为,在他们的Wiki文章中讨论过shared behaviors。我正在使用ts-mocha来解释异步/等待功能。

所以我使用supertest-session编写了登录和注销的功能,它看起来像这样:

export function authHooks()
{
    const email = UsersSeed[0].email;
    const password = UsersSeed[0].password;

    before(`login ${email}`, async function()
    {
        await this.session.post('/api/account/login')
            .send({ email, password })
            .expect(201);
    });

    after(`logout ${email}`, async function()
    {
        await this.session.get('/api/account/logout')
            .expect(200);
    });
}

在我的describe内部,我设置了this.session,并在it - 语句中我可以重复使用它。它看起来有点像这样:

import { expect } from 'chai';
import * as Session from 'supertest-session';
import { authHooks } from './authHooks';

describe('Some Suite', () =>
{
    before(function()
    {
        this.session = new Session(SomeApp);
    });

    after(function()
    {
        this.session.destroy();
    });

    describe('when not authenticated', () =>
    {
        it('returns 403', async function()
        {
            await this.session.get('/api/jobs')
                .expect(403)
                .expect({ statusCode: 403, message: 'Forbidden resource' });
        });
    });

    describe('when authenticated', () =>
    {
        authHooks();

        describe('when finding jobs', () =>
        {
            it('returns all jobs', async function()
            {
                await this.session.get('/api/jobs')
                    .expect(200)
                    .then((response) =>
                    {
                        expect(response.body).to.deep.eq(SomeThing);
                    });
            });
        });
    });
});

我不确定这是否是实现它的最佳方式(我不是个人使用function而非() => {}的粉丝),但我确认它有效

上述代码不会主要运行,因为我保护代码细节,但希望这将为您提供至少一个选项,也许其他人可以显示更好的方法来执行此操作。