如何在测试前 运行 异步任务并存储结果以供进一步测试 - Supertest

How to run async task before tests and store the result for further tests - Supertest

我正在尝试为我的应用程序中的模块编写 API 测试。该应用程序有一个用户和与该用户对应的文章,并且有 GET、POST、DELETE 文章请求。

我正在为这些请求编写测试用例,方法是为每个 GET、POST 等创建一个 describe 块,每个块内都是我的测试。但问题是这些测试需要该用户的 key 才能知道它需要为哪个用户获取、创建和删除文章。目前,我对该密钥进行了硬编码,但我想为该文件中的所有测试创建一个新用户,并使用创建该用户时返回的密钥。然后在所有测试完成后删除用户。

基本上,它归结为 运行 在所有这些测试之前执行一个异步任务,并在所有测试中使用该任务的结果,并在所有测试完成后撤消该任务。我对后端 API 测试还很陌生,所以我不知道从哪里开始。感谢任何帮助。

经过几个小时的研究,我自己找到了答案。

创建一个 describe 块并使用其中的所有其他 describe 块。并使用钩子在测试前获取数据并在测试后清除它。使用 this 关键字存储数据。

describe('Testing articles module', function () {
    before(async function () {
        const res = await createUser();  // Do whatever you want before running tests
        this.myKey = res.body.key;  // Store data using 'this'
    });

    after(async function () {
        await deleteUser();  // Undo the action done in 'before' hook if you want
    });

    describe('Testing GET request', function () {
        it('should return status 200', function () {
            // You can use this.myKey here
            // and inside all the tests in other describe blocks as well
        });
    });

    describe('Testing POST request');

    describe('Testing DELETE request');
});
顾名思义,

afterbefore 是钩子,您可以在所有测试之前和之后使用它来做一些事情。您可以在这里阅读更多内容:- Mocha hooks

此外,由于 this 关键字,在这种情况下不要使用箭头函数,因为箭头函数没有 this。它会引起问题。 Read about it here