【发布时间】:2021-11-03 18:23:55
【问题描述】:
希望有人能帮助我理解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();
});
知道为什么使用全局 spyOn 变量的版本不能按预期工作吗?
编辑:
它似乎与原型无关。
没有任何类的函数也存在同样的问题,
将 First Code sn-p (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();
});
但是,如果我们将第二个 sn-p 更新为以下内容,则测试成功并执行控制台日志:
import * as testlib from './TestObj';
const spyObj: jest.SpyInstance;
beforeEach(() => {
spyObj = jest.spyOn(testlib, 'foo');
});
test('debug test', () => {
testlib.foo();
expect(spyObj).toHaveBeenCalled();
});
但是我仍然不知道为什么会发现这个问题。
【问题讨论】:
标签: javascript typescript testing jestjs