Node.js 它';使用jest和ts jest用静态方法模拟类是不可能的
我有两个类来模拟简单的求和运算Node.js 它';使用jest和ts jest用静态方法模拟类是不可能的,node.js,typescript,testing,jestjs,ts-jest,Node.js,Typescript,Testing,Jestjs,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 以及操作处理器
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)
})
})
从“/Calculator”导入计算器
从“/SumProcessor”导入SumProcessor
从“ts jest/utils”导入{mocked}
笑话模拟('./SumProcessor')
描述('计算器',()=>{
它('测试和',()=>{
const somadomock=(SumProcessor)
SomadorMock.mockImplementation(()=>{
返回{
总和:()=>2
}
})
const somador=新的somadomock()
const calc=新计算器(索马多)
期望(计算总数(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...
TS2345:类型为“()=>jest.Mock”的参数不能分配给类型为“(值?:对象,选项)的参数
s?:BuildOptions)=>summoperator'。
类型“Mock”缺少类型“SumOperator”中的以下属性。。。
如果从SumProcessor类中删除静态方法,则一切正常
有人能帮忙吗 因为您已经用
jest.mock('./SumProcessor')模拟了SumProcessor
类代码>您只需向要模拟的方法添加间谍,例如:
jest.spyOn(SumProcessor.prototype,'sum').mockImplementation(()=>2)代码>
这样,您的测试类将如下所示:
从“/Calculator”导入计算器
从“/SumProcessor”导入SumProcessor
笑话模拟('./SumProcessor')
描述('计算器',()=>{
它('测试和',()=>{
spyOn(SumProcessor.prototype,'sum').mockImplementation(()=>2);
const somador=new SumProcessor();
const calc=新计算器(索马多)
期望(计算总数(1,1)).toBe(2)
})
})
更简单,对吧?因为您已经用jest.mock('./SumProcessor')模拟了SumProcessor
类代码>您只需向要模拟的方法添加间谍,例如:
jest.spyOn(SumProcessor.prototype,'sum').mockImplementation(()=>2)代码>
这样,您的测试类将如下所示:
从“/Calculator”导入计算器
从“/SumProcessor”导入SumProcessor
笑话模拟('./SumProcessor')
描述('计算器',()=>{
它('测试和',()=>{
spyOn(SumProcessor.prototype,'sum').mockImplementation(()=>2);
const somador=new SumProcessor();
const calc=新计算器(索马多)
期望(计算总数(1,1)).toBe(2)
})
})
简单多了,对吧?太好了!对于没有默认构造函数的模拟类呢?如何模拟整个类并从中创建新实例?你是说只有静态方法的类?如果是这种情况,你可以使用相同的方法,并添加间谍的静态方法,如果必要的。谢谢回复!不仅仅是静态方法。如果我想模拟没有默认构造函数的Calculator类,该怎么办?太好了!对于没有默认构造函数的模拟类呢?如何模拟整个类并从中创建新实例?你是说只有静态方法的类?如果是这种情况,你可以使用相同的方法,并添加间谍的静态方法,如果必要的。谢谢回复!不仅仅是静态方法。如果我想模拟没有默认构造函数的Calculator类,该怎么办?