最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - How can I test a catch block using jest nodejs? - Stack Overflow

programmeradmin0浏览0评论

How can i test the catch block on a es6 Class

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;

using jest how can i write the test case to cover the catch block also.

How can i test the catch block on a es6 Class

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;

using jest how can i write the test case to cover the catch block also.

Share Improve this question edited Feb 8, 2019 at 10:11 skyboyer 23.8k7 gold badges62 silver badges71 bronze badges asked Feb 7, 2019 at 12:09 BeginnerBeginner 9,13511 gold badges49 silver badges92 bronze badges
Add a ment  | 

2 Answers 2

Reset to default 5

You can mock the method readFileSync from fs to force it to return undefined. JSON.parse(undefined) will throw an error, thus you can check the catch side of the code.

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

First of all, in the catch side you should throw the error. Just returning it is not a good practise when managing errors, from my point of view. But there is people doing it.

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

Having this code, you can actually test your catch block code in two different ways with 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`);
 }
});

Both of them imply to mock the readFileSync method from fs module as I suggested before. You can even mock the whole fs module with Jest. Or you could just mock the JSON.parse. There are plenty of options to be able to test the catch block.

Jest has its own method for testing exception, you can use toThrow. It looks something like this

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

Note

Since your function is asynchronous, try to explicitly define your error, then use await to resolve/reject it, After that you can check for the actual rejection

test('throws on octopus', () => {
  await expect(user.getUserName(3)).rejects.toEqual({
    error: 'User with 3 not found.',
  });
});
发布评论

评论列表(0)

  1. 暂无评论