在原生的ES6类或使用Babel转译的类中,无需检查是否调用了
super()
。
在子类构造函数中不调用
super
将导致类实例化时出错:
ReferenceError: Must call super constructor in derived class before accessing 'this' or returning from derived constructor
Babel
也提供了保障。
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)