首页 > 解决方案 > 如何使用 jest nodejs 测试 catch 块?

问题描述

我如何在 es6 类上测试 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) {
      return err;
    }
  }
}

module.exports = Service;

开玩笑,我如何编写测试用例来覆盖 catch 块。

标签: javascriptjestjs

解决方案


您可以模拟方法readFileSyncfromfs以强制它返回undefinedJSON.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块。


推荐阅读