【发布时间】:2020-07-27 07:31:13
【问题描述】:
这是一个普通的 TS 项目。没有框架。
我有followed through this article here,作者以此模拟addEventListener 方法(但是在窗口上)。
我很困惑为什么模拟函数没有注册为被调用。
console.log
called in here
at Object.handleClick [as click] (src/painter/painter.ts:24:13)
FAIL src/painter/painter.test.ts
Painter Setup
✕ Should add event handlers to canvas (14 ms)
● Painter Setup › Should add event handlers to canvas
expect(received).toHaveBeenCalled()
Matcher error: received value must be a mock or spy function
简化实现:
class Painter {
constructor(target: HTMLCanvasElement) {
this.canvas = target;
//...
this.init();
}
init() {
this.canvas.addEventListener("click", this.handleClick);
}
// I know that the this context is wrong here, but trying to simplify the issue
handleClick(event: MouseEvent) {
console.log('called in here');
};
}
// testing
const eventListeners: Record<string, Function> = {};
let canvas = document.createElement("canvas");
canvas.addEventListener = jest.fn((eventName: string, callBack: Function) => {
eventListeners[eventName] = callBack;
}) as jest.Mock;
describe("Painter Setup", function () {
it("Should add event handlers to canvas", () => {
const painter = new Painter(canvas);
eventListeners.click({
clientX: 0,
clientY: 0,
});
expect(painter.handleClick).toHaveBeenCalled();
});
});
【问题讨论】:
标签: typescript unit-testing mocking jestjs