不可能使用 jest 和 ts-jest 的静态方法模拟类



我有两个类模拟一个简单的求和运算。

import SumProcessor from "./SumProcessor";
class Calculator {
constructor(private _processor: SumProcessor) { }
sum(a: number, b: number): number {
return this._processor.sum(a, b)
}
}
export default Calculator

以及运算处理器。

class SumProcessor {
sum(a: number, b: number): number {
return a + b
}
static log() {
console.log('houston...')
}
}
export default SumProcessor

我试着模拟SumProcessor类,用jest+ts-jest编写下面的单元测试。

import Calculator from "./Calculator"
import SumProcessor from "./SumProcessor"
import { mocked } from "ts-jest/utils"
jest.mock('./SumProcessor')
describe('Calculator', () => {
it('test sum', () => {
const SomadorMock = <jest.Mock>(SumProcessor)
SomadorMock.mockImplementation(() => {
return {
sum: () => 2        
}
})
const somador = new SomadorMock()
const calc = new Calculator(somador)
expect(calc.sum(1, 1)).toBe(2)
})
})

当静态方法存在于SumProcessor类中时,模拟代码const SomadorMock=(SumProcessor(指示以下编译错误:

TS2345: Argument of type '() => jest.Mock<any, any>' is not assignable to parameter of type '(values?: object, option
s?: BuildOptions) => SumOperator'.
Type 'Mock<any, any>' is missing the following properties from type 'SumOperator...

如果从SumProcessor类中删除静态方法,则一切正常。

有人能帮忙吗?

由于您已经用jest.mock('./SumProcessor');模拟了SumProcessor类,因此您只需在要模拟的方法中添加一个spy即可,例如:jest.spyOn(SumProcessor.prototype, 'sum').mockImplementation(() => 2);

这样一来,你的测试类就会看起来像这样:

import Calculator from "./Calculator"
import SumProcessor from "./SumProcessor"
jest.mock('./SumProcessor')
describe('Calculator', () => {
it('test sum', () => {
jest.spyOn(SumProcessor.prototype, 'sum').mockImplementation(() => 2);
const somador = new SumProcessor();
const calc = new Calculator(somador)
expect(calc.sum(1, 1)).toBe(2)
})
})

简单多了,对吧?

最新更新