【问题标题】:Jest + supertest in NodeJS, async/awaitNodeJS 中的 Jest + supertest,异步/等待
【发布时间】:2018-10-12 13:15:39
【问题描述】:

我尝试用 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]);
        });
      }
    }

在 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]);
  });

异步/等待中的问题 - testIt 在请求用户之前运行。

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

如何解决?

【问题讨论】:

  • test 里面的testIt 是什么?
  • 我不认为describe 支持异步函数。
  • @Bergi 不错,就是这样。 describeit描述了一组测试
  • 我了解,该描述不支持异步/等待。如果我将测试(或它)从函数 testIt 中描述块,它将起作用。但我想要更多的抽象(测试块对于许多测试来说非常大)。

标签: javascript node.js async-await jestjs


【解决方案1】:

看来您需要让 jest 知道 expect 是一个异步方法,使用 resolves

这是来自 Jest 文档的示例代码:

// async/await can be used.
it('works with async/await', async () => {
  expect.assertions(1);
  const data = await user.getUserName(4);
  expect(data).toEqual('Mark');
});

// async/await can also be used with `.resolves`.
it('works with async/await and resolves', async () => {
  expect.assertions(1);
  await expect(user.getUserName(5)).resolves.toEqual('Paul');
});

https://facebook.github.io/jest/docs/en/tutorial-async.html#async-await

【讨论】:

    【解决方案2】:

    因此,我不得不将 test 移至 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]);
      });

    // 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;

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-03-31
      • 2020-01-31
      • 2021-04-16
      • 2019-07-20
      • 2018-02-08
      • 2019-06-30
      • 2019-08-08
      相关资源
      最近更新 更多