簡體   English   中英

NodeJS中的Jest + Supertest,異步/等待

[英]Jest + supertest in NodeJS, async/await

我嘗試用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的塊並在測試內部創建請求用戶,它將起作用。 但是我想要更多的抽象(許多測試中的測試塊很大)

如何解決?

看起來你需要讓笑話知道,想到的是異步方法,以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

結果,我不得不將測試移至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; 

但是我不得不將自己局限於所有角色的一個答案,而不是每個角色的單個答案,因為我想要更少的代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM