Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 它';使用jest和ts jest用静态方法模拟类是不可能的_Node.js_Typescript_Testing_Jestjs_Ts Jest - Fatal编程技术网

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类,该怎么办?