Как я могу проверить блок catch, используя jest nodejs? - PullRequest
0 голосов
/ 07 февраля 2019

Как я могу протестировать блок catch на классе es6

const fs = require('fs');
class Service {
  constructor(accessToken) {
    this.accessToken = accessToken;
  }

  async getData() { // eslint-disable-line class-methods-use-this
    try {


      const data = fs.readFileSync(`${__dirname}/models/mockData.json`, { encoding: 'utf8' });
      const returnData = JSON.parse(data);
      return returnData;
    } catch (err) {
      return err;
    }
  }
}

module.exports = Service;

, используя шутку, как я могу написать контрольный пример, охватывающий также блок catch.

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

Вы можете смоделировать метод readFileSync из fs, чтобы заставить его вернуться undefined.JSON.parse(undefined) выдаст ошибку, поэтому вы можете проверить сторону перехвата кода.

  fs.readFileSync = jest.fn()
  fs.readFileSync.mockReturnValue(undefined);

Прежде всего, на стороне catch вы должны выбросить ошибку.С моей точки зрения, просто возвращать это не очень хорошая практика при управлении ошибками.Но есть люди, которые делают это.

const fs = require('fs');

class Service {
  constructor(accessToken) {
    this.accessToken = accessToken;
  }

  async getData() { // eslint-disable-line class-methods-use-this
    try {
      const data = fs.readFileSync(`${__dirname}/models/mockData.json`, { encoding: 'utf8' });
      const returnData = JSON.parse(data);
      return returnData;
    } catch (err) {
      throw err;
    }
  }
}

Имея этот код, вы можете на самом деле протестировать свой catch блочный код двумя способами с помощью Jest:

beforeEach(() => {
  fs.readFileSync = jest.fn();
});

afterEach(() => {
  fs.readFileSync.mockClear();
});

test('Async expect test', () => {
  fs.readFileSync.mockReturnValue(undefined);

  const result = service.getData();

  expect(result).rejects.toThrow();
});

test('Async / await test', async() => {
  fs.readFileSync.mockReturnValue(undefined);

  try {
    await service.getData();
  } catch (err) {
    expect(err.name).toEqual('TypeError');
    expect(err.message).toEqual(`Cannot read property 'charCodeAt' of undefined`);
 }
});

Оба они подразумеваютчтобы смоделировать метод readFileSync из модуля fs, как я предлагал ранее.Вы даже можете издеваться над всем модулем fs с помощью Jest.Или вы можете просто издеваться над JSON.parse.Существует множество опций для проверки блока catch.

0 голосов
/ 07 февраля 2019

Jest имеет свой собственный метод тестирования исключений, вы можете использовать toThrow .Это выглядит примерно так:

test('throws on octopus', () => {
  expect(() => {
    drinkFlavor('octopus');
  }).toThrow(); // Test the exception here
});

Примечание

Поскольку ваша функция асинхронная , попробуйте явно определить вашу ошибку, а затем используйте await, чтобы устранить или отклонить ееПосле этого вы можете проверить фактические rejection

test('throws on octopus', () => {
  await expect(user.getUserName(3)).rejects.toEqual({
    error: 'User with 3 not found.',
  });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...