【问题标题】:It's not possible to mock classes with static methods using jest and ts-jest无法使用 jest 和 ts-jest 使用静态方法模拟类
【发布时间】:2020-06-21 18:55:28
【问题描述】:

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

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 类中删除静态方法,则一切正常。

有人可以帮忙吗?

【问题讨论】:

    标签: node.js typescript testing jestjs ts-jest


    【解决方案1】:

    因为你已经用jest.mock('./SumProcessor'); 模拟了SumProcessor 类,你可以在你想模拟的方法中添加一个间谍,例如: jest.spyOn(SumProcessor.prototype, 'sum').mockImplementation(() =&gt; 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)
      })
    })
    

    简单多了,对吧?

    【讨论】:

    • 太棒了!那么没有默认构造函数的模拟类呢?如何模拟整个类并从中创建新实例?
    • 你的意思是只有静态方法的类?如果是这种情况,您可以使用相同的方法,并在必要时将 spy 添加到静态方法中。
    • 感谢您的回复!不仅仅是静态方法。如果要模拟没有默认构造函数的Calculator类怎么办?
    猜你喜欢
    • 2020-09-08
    • 2020-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-08
    • 2019-11-18
    • 1970-01-01
    • 2021-09-14
    相关资源
    最近更新 更多