玩笑单元测试是否调用了super()

时间:2018-07-06 18:37:47

标签: unit-testing ecmascript-6 jestjs super

我有一个自定义错误类,该类扩展了Javascript中的内置Error类。我想到的问题是,通过Jest单元测试是否调用了“ super()”方法。

export class AppError extends Error {
  public name: string;
  public message: string;
  public status?: number;
  public data?: any;
  constructor(message: string, status?: number, data?: any) {
    super(); <-- this guy!!
    this.name = 'AppError';
    this.status = status || 500;
    this.message = message;
    this.data = data;
  }
}

有什么测试方法吗?谢谢。

1 个答案:

答案 0 :(得分:4)

没有理由检查在本机ES6类或通过Babel转译的类中均未调用super()

在子类构造函数中不调用super会导致类实例化错误:

  

ReferenceError:访问'this'或从派生构造函数返回之前,必须在派生类中调用超级构造函数

通天塔语provides a safeguard

function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }

有可能通过模拟子类原型来检查是否调用了父构造函数(对声明super()参数可能很有用),例如:

let ParentOriginal;
let ParentMock;

beforeEach(() => {
  ParentOriginal = Object.getPrototypeOf(AppError);
  ParentMock = jest.fn();
  Object.setPrototypeOf(AppError, ParentMock);
});

it('..', () => {
  new AppError(...);
  expect(ParentMock.mock.calls.length).toBe(1);
})

afterEach(() => {
  Object.setPrototypeOf(AppError, ParentOriginal);
});

期望在本机类和使用Babel转译的类中模拟super

但是该测试是多余的,因为缺少super()会以任何方式导致错误。测试AppError是从Error继承而来的,这是需要在此处进行测试的所有内容:

expect(new AppError(...)).toBeInstanceOf(Error)