Пытаюсь научиться писать тесты, как мне писать, когда у меня есть обещание?

Я создал функцию, которая подключается к API и возвращает обещание. Я хотел протестировать эту функцию, поэтому создал фиктивную функцию в Jest, чтобы справиться с ней, однако я не совсем уверен, что делаю это правильно, и мне очень сложно найти хорошие ресурсы о том, как писать хорошие модульные тесты.

export const sbConnect = (userId) => {
  return new Promise((resolve, reject) => {
    const sb = new SendBird({appId: APP_ID});
    sb.connect(userId, API_Token, (user, error) => {
      if (error) {
        reject(error);
      } else {
        resolve(user);
      }
    });
  });
};

Это функция, которую я пытаюсь проверить. Я создал тест и пробовал это до сих пор.

import {sbConnect} from '../helpers/sendBirdSetupActions';

const SendBird = jest.fn();

describe('Connects to SendBird API', () => {
  it('Creates a new SB instance', () => {
    let userId = 'testUser';
    let APP_ID = 'Testing_App_ID_001';
    sbConnect(userId);
    expect(SendBird).toBeCalled();
  });
});

jest.fn() в вашем тесте не имеет никакого отношения ни к чему, что происходит в реальном коде. Предположительно SendBirdimport встроен в тестируемый код, так что загляните на jestjs.io/docs/en/es6-class-mocks . Что касается написания тестов с использованием промисов, см. jestjs.io/docs/en/tutorial-async.

jonrsharpe 09.12.2020 17:04

Я читал оба этих документа, чтобы зайти так далеко, я продолжу изучение и посмотрю, станет ли это иметь смысл.

YellowGuy 09.12.2020 17:13
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
2
205
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать jest.mock(moduleName, factory, options) для имитации sendbird модуля вручную.

Мокайте SendBird конструктор, экземпляр и его методы.

Например.

index.ts:

import SendBird from 'sendbird';

const API_Token = 'test api token';
const APP_ID = 'test api id';

export const sbConnect = (userId) => {
  return new Promise((resolve, reject) => {
    const sb = new SendBird({ appId: APP_ID });
    sb.connect(userId, API_Token, (user, error) => {
      if (error) {
        reject(error);
      } else {
        resolve(user);
      }
    });
  });
};

index.test.ts:

import { sbConnect } from './';
import SendBird from 'sendbird';

const mSendBirdInstance = {
  connect: jest.fn(),
};
jest.mock('sendbird', () => {
  return jest.fn(() => mSendBirdInstance);
});

describe('65220363', () => {
  afterAll(() => {
    jest.resetAllMocks();
  });
  it('should get user', async () => {
    const mUser = { name: 'teresa teng' };
    mSendBirdInstance.connect.mockImplementationOnce((userId, API_Token, callback) => {
      callback(mUser, null);
    });
    const actual = await sbConnect('1');
    expect(actual).toEqual(mUser);
    expect(SendBird).toBeCalledWith({ appId: 'test api id' });
    expect(mSendBirdInstance.connect).toBeCalledWith('1', 'test api token', expect.any(Function));
  });

  it('should handle error', async () => {
    const mError = new Error('network');
    mSendBirdInstance.connect.mockImplementationOnce((userId, API_Token, callback) => {
      callback(null, mError);
    });
    await expect(sbConnect('1')).rejects.toThrow(mError);
    expect(SendBird).toBeCalledWith({ appId: 'test api id' });
    expect(mSendBirdInstance.connect).toBeCalledWith('1', 'test api token', expect.any(Function));
  });
});

результат модульного теста:

 PASS  src/stackoverflow/65220363/index.test.ts (11.115s)
  65220363
    ✓ should get user (6ms)
    ✓ should get user (3ms)

----------|----------|----------|----------|----------|-------------------|
File      |  % Stmts | % Branch |  % Funcs |  % Lines | Uncovered Line #s |
----------|----------|----------|----------|----------|-------------------|
All files |      100 |      100 |      100 |      100 |                   |
 index.ts |      100 |      100 |      100 |      100 |                   |
----------|----------|----------|----------|----------|-------------------|
Test Suites: 1 passed, 1 total
Tests:       2 passed, 2 total
Snapshots:   0 total
Time:        12.736s

исходный код: https://github.com/mrdulin/jest-codelab/tree/master/src/stackoverflow/65220363

Другие вопросы по теме