我希望有人能帮助我理解 js 原型的交互性和jest.spOn()
.
我有一个小例子:
文件中的示例类TestObj.ts
:
export default class TestObj {
foo() {
// Do Something e.g.
console.log("Hello World!");
}
}
以下示例测试用例成功,但console.log
永远不会被执行。
import TestObj from './TestObj';
const spyObj = jest.spyOn(TestObj.prototype, 'foo');
test('debug test', () => {
const obj = new TestObj();
obj.foo();
expect(spyObj).toHaveBeenCalled();
});
如果我将示例测试用例更改为以下内容,则测试成功并且console.log
语句按预期被调用。
import TestObj from './TestObj';
test('debug test', () => {
const spyObj = jest.spyOn(TestObj.prototype, 'foo');
const obj = new TestObj();
obj.foo();
expect(spyObj).toHaveBeenCalled();
});
知道为什么使用全局间谍变量的版本不能按预期工作吗?
Edit:
它似乎与原型无关。
对于没有任何类的函数也存在同样的问题,
编辑第一个代码片段(TestObj.ts
)对此:
export foo() {
// Do Something e.g.
console.log("Hello World!");
};
我们在更新的第二个截图中收到了同样的问题。 (测试成功,但从未到达控制台日志。)
import * as testlib from './TestObj';
const spyObj = jest.spyOn(testlib, 'foo');
test('debug test', () => {
testlib.foo();
expect(spyObj).toHaveBeenCalled();
});
但是,如果我们将第二个代码片段更新为以下内容,则测试会成功并执行控制台日志:
import * as testlib from './TestObj';
const spyObj: jest.SpyInstance;
beforeEach(() => {
spyObj = jest.spyOn(testlib, 'foo');
});
test('debug test', () => {
testlib.foo();
expect(spyObj).toHaveBeenCalled();
});
但是我仍然不知道为什么会发现这个问题。