NodeJS 中的 Jest + supertest,async/await

Ale*_*rov 5 javascript node.js async-await jestjs

我尝试用 Jest 测试我的 api。我想要更多的抽象,所以我创建了这个函数:

const tokensConfig = config.get('test.tokens');

function testIt(method = 'get', url = '/', statuses = [], body = {}) {
      const testNames = ['unauthorized', 'user', 'admin'];
      const tokens = [null, tokensConfig.user, tokensConfig.admin];
    
      for (let i = 0; i < testNames.length; i++) {
        test(testNames[i], async () => {
          const response = await request(app)
            [method](url)
            .set('Accept', 'application/json')
            .set('Authorization', tokens[i])
            .send(body);
          expect(response.statusCode).toBe(statuses[i]);
        });
      }
    }
Run Code Online (Sandbox Code Playgroud)

在 test.js 文件中,我运行:

const config  = require('config');
const request = require('supertest');
const testIt  = require('./testIt');
const app     = require('../app');

// It's work
describe('get user by email', () => {
    testIt('get', '/users/get-by-email/user@test', [401, 403, 200]);
  });
  
// It's not work  
describe('delete user', async () => {
    const userByEmail = await request(app)
      .get('/users/get-by-email/user@test')
      .set('Accept', 'application/json')
      .set('Authorization', config.get('test.tokens.admin'));

    testIt('delete', `/users/${userByEmail._id}`, [401, 403, 200]);
  });
Run Code Online (Sandbox Code Playgroud)

async/await 中的问题 - testIt 在请求用户之前运行。

如果我移动测试(或它)来描述函数 testIt 中的块并在测试中创建请求用户,它将起作用。但我想要更多的抽象(许多测试的测试块非常大)

怎么修?

Ale*_*rov 1

结果,我不得不将测试移至test.js:

// test.js

it('delete user', async () => {
    const userByEmail = await request(app)
      .get('/users/get-by-email/user@test')
      .set('Accept', 'application/json')
      .set('Authorization', config.get('test.tokens.admin'));

    const result = await testIt('delete', `/users/${userByEmail.body._id}`);
    expect(result).toEqual([401, 403, 401, 200]);
  });
Run Code Online (Sandbox Code Playgroud)

// testIt.js

const config  = require('config');
const request = require('supertest');
const app     = require('../app');

const tokensConfig = config.get('test.tokens');

async function testIt(method = 'get', url = '/', body = {}) {
  const testNames = ['unauthorized', 'user', 'adminTokenExpired', 'admin'];
  const tokens = [null, tokensConfig.userTokenInfinity, tokensConfig.adminTokenExpired, tokensConfig.adminTokenInfinity];
  let result = [];

  for (let i = 0; i < testNames.length; i++) {
    const response = await request(app)
      [method](url)
      .set('Accept', 'application/json')
      .set('Authorization', tokens[i])
      .send(body);

    result.push(response.statusCode);
  }

  return result;
}

module.exports = testIt;
Run Code Online (Sandbox Code Playgroud)

但我不得不限制自己对所有角色的一个答案,而不是对每个角色的单独答案,因为我想要更少的代码。