如何使用Jest Node.js测试catch块?

时间:2019-02-07 12:09:02

标签: javascript jestjs

如何在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块。

2 个答案:

答案 0 :(得分:2)

您可以从readFileSync模拟方法fs强制其返回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;
    }
  }
}

有了此代码,您实际上可以使用Jest以两种不同的方式测试catch块代码:

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方法。您甚至可以使用Jest模拟整个fs模块。或者,您可以仅嘲笑JSON.parse。有很多选项可以测试catch块。

答案 1 :(得分:0)

Jest有自己的异常测试方法,您可以使用toThrow。看起来像这样

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

注意

由于您的函数是异步,请尝试显式定义错误,然后使用await来解决/拒绝该错误,之后您可以检查实际的rejection < / p>

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