javascript - 如何使用 jest Nodejs 测试 catch block ?

标签 javascript jestjs

如何在 es6 类上测试 catch block

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;

使用 Jest ,我如何编写测试用例来覆盖 catch block 。

最佳答案

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

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

首先,在 catch 端,您应该抛出错误。从我的 Angular 来看,在管理错误时仅仅返回它并不是一个好的做法。但确实有人这么做。

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 block 代码:

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

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

关于javascript - 如何使用 jest Nodejs 测试 catch block ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54573031/

相关文章:

javascript简写语法

javascript - 使用 Jest 的 setTimeout 测试 Promise

javascript - 如何输出从 1 到 10 的每个数字。在 JavaScript 中使用随机数

javascript - 如果不是第一个,则设置日期列

javascript - 如何等待 webfonts 加载?

javascript - 如何使用 React JS 将 MP3 文件上传到 Firebase-Firestore 数据库?

javascript - 用 Jest 测试 setTimeout 上的毫秒参数

node.js - Jest 通过了测试,但 --covering 选项未拾取文件

javascript - Windows 8.1 上的 Jest 最小报告

javascript - 使用 sinon 如何 stub 或伪造回调的属性