99re热这里只有精品视频,7777色鬼xxxx欧美色妇,国产成人精品一区二三区在线观看,内射爽无广熟女亚洲,精品人妻av一区二区三区

Jest 異步示例

2021-09-18 20:20 更新

首先, 像Jest 從安裝開始里面所說的那樣, 啟用babel的支持

讓我們實(shí)現(xiàn)一個(gè)從 API 獲取用戶數(shù)據(jù)并返回用戶名的模塊。

  1. // user.js
  2. import request from './request';
  3. export function getUserName(userID) {
  4. return request('/users/' + userID).then(user => user.name);
  5. }

在上面的實(shí)現(xiàn)中,我們期望?request.js?模塊返回一個(gè) promise。我們鏈接一個(gè)調(diào)用來?then?接收用戶名。

現(xiàn)在想象一個(gè)?request.js?進(jìn)入網(wǎng)絡(luò)并獲取一些用戶數(shù)據(jù)的實(shí)現(xiàn):

  1. // request.js
  2. const http = require('http');
  3. export default function request(url) {
  4. return new Promise(resolve => {
  5. // 這是一個(gè)HTTP請(qǐng)求的例子, 用來從API獲取用戶信息
  6. // This module is being mocked in __mocks__/request.js
  7. http.get({path: url}, response => {
  8. let data = '';
  9. response.on('data', _data => (data += _data));
  10. response.on('end', () => resolve(data));
  11. });
  12. });
  13. }

因?yàn)槲覀冊(cè)跍y(cè)試中不想去網(wǎng)絡(luò),所以我們將?request.js?在?__mocks__?文件夾中為我們的模塊創(chuàng)建一個(gè)手動(dòng)模擬(文件夾區(qū)分大小寫,?__MOCKS__?將不起作用)。就像是這樣:

  1. // __mocks__/request.js
  2. const users = {
  3. 4: {name: 'Mark'},
  4. 5: {name: 'Paul'},
  5. };
  6. export default function request(url) {
  7. return new Promise((resolve, reject) => {
  8. const userID = parseInt(url.substr('/users/'.length), 10);
  9. process.nextTick(() =>
  10. users[userID]
  11. ? resolve(users[userID])
  12. : reject({
  13. error: 'User with ' + userID + ' not found.',
  14. }),
  15. );
  16. });
  17. }

現(xiàn)在我們就來編寫我們的異步函數(shù)的測(cè)試

  1. // __tests__/user-test.js
  2. jest.mock('../request');
  3. import * as user from '../user';
  4. //斷言必須返回一個(gè)primose
  5. it('works with promises', () => {
  6. expect.assertions(1);
  7. return user.getUserName(4).then(data => expect(data).toEqual('Mark'));
  8. });

我們調(diào)用 ?jest.mock('../request ')? 告訴jest 使用我們手動(dòng)的創(chuàng)建的模擬數(shù)據(jù)。 ?it ?斷言的是將會(huì)返回一個(gè)Promise對(duì)象,你可以在任何時(shí)候給?expect?打電話,只要你在最后回復(fù)一個(gè)承諾。

.resolves

有一種不那么冗長(zhǎng)的方法?resolves?用于將已履行的 Promise 的值與任何其他匹配器一起解包。如果 Promise 被拒絕,則斷言將失敗。

  1. it('works with resolves', () => {
  2. expect.assertions(1);
  3. return expect(user.getUserName(5)).resolves.toEqual('Paul');
  4. });

async/await

也可以使用?async?/?await?語法編寫測(cè)試。以下是如何編寫與之前相同的示例:

  1. // 使用async/await
  2. it('works with async/await', async () => {
  3. expect.assertions(1);
  4. const data = await user.getUserName(4);
  5. expect(data).toEqual('Mark');
  6. });
  7. // async/await 也可以和 `.resolves` 一起使用.
  8. it('works with async/await and resolves', async () => {
  9. expect.assertions(1);
  10. await expect(user.getUserName(5)).resolves.toEqual('Paul');
  11. });

要在項(xiàng)目中啟用 ?async?/?await?,請(qǐng)?jiān)谀愕?babel.config.js?文件中安裝并啟用@babel/preset-env功能。

錯(cuò)誤處理

可以使用? .catch? 方法處理錯(cuò)誤。 請(qǐng)確保添加 ?expect.assertions? 來驗(yàn)證一定數(shù)量的斷言被調(diào)用。 否則一個(gè)fulfilled態(tài)的Promise 不會(huì)讓測(cè)試失敗︰

  1. //用 Promise.catch 測(cè)試一個(gè)異步的錯(cuò)誤
  2. it('tests error with promises', () => {
  3. expect.assertions(1);
  4. return user.getUserName(2).catch(e =>
  5. expect(e).toEqual({
  6. error: 'User with 2 not found.',
  7. }),
  8. );
  9. });
  10. // Or using async/await.
  11. it('tests error with async/await', async () => {
  12. expect.assertions(1);
  13. try {
  14. await user.getUserName(1);
  15. } catch (e) {
  16. expect(e).toEqual({
  17. error: 'User with 1 not found.',
  18. });
  19. }
  20. });

.rejects

該?.rejects?助手的工作方式類似于?.resolves?幫手。如果 Promise 被拒絕,則測(cè)試將自動(dòng)失敗。?expect.assertions(number)?不是必需的,但建議驗(yàn)證在測(cè)試期間調(diào)用了一定數(shù)量的assertions。其實(shí)不然容易忘記?return?/?await?的?.resolves? ?assertions?。

  1. // 用`.rejects`.來測(cè)試一個(gè)異步的錯(cuò)誤
  2. it('tests error with rejects', () => {
  3. expect.assertions(1);
  4. return expect(user.getUserName(3)).rejects.toEqual({
  5. error: 'User with 3 not found.',
  6. });
  7. });
  8. // 或者與async/await 一起使用 `.rejects`.
  9. it('tests error with async/await and rejects', async () => {
  10. expect.assertions(1);
  11. await expect(user.getUserName(3)).rejects.toEqual({
  12. error: 'User with 3 not found.',
  13. });
  14. });

此示例的代碼位于examples/async。

如果想測(cè)試計(jì)時(shí)器,例如setTimeout,請(qǐng)查看計(jì)時(shí)器模擬文檔。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)