如何使用 jest Nodejs 测试 catch 块?

DIL*_*MAS 5 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;
Run Code Online (Sandbox Code Playgroud)

使用笑话我如何编写测试用例来覆盖 catch 块。

Dez*_*Dez 5

readFileSync您可以模拟from 的方法fs以强制其返回undefinedJSON.parse(undefined)会抛出错误,因此您可以检查代码的 catch 部分。

  fs.readFileSync = jest.fn()
  fs.readFileSync.mockReturnValue(undefined);
Run Code Online (Sandbox Code Playgroud)

首先,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;
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

有了这段代码,您实际上可以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`);
 }
});
Run Code Online (Sandbox Code Playgroud)

正如我之前建议的那样,它们都意味着模拟模块readFileSync中的方法fs。您甚至可以使用 Jest 模拟整个fs模块。或者你可以只是嘲笑JSON.parse. 有很多选项可以测试该catch块。


mol*_*amk 1

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

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

笔记

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

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