簡體   English   中英

不可能使用 jest 和 ts-jest 用靜態方法模擬類

[英]It's not possible to mock classes with static methods using jest and 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');SumProcessorjest.mock('./SumProcessor'); 你可以在你想要模擬的方法中添加一個間諜,例如: 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)
  })
})

簡單多了,對吧?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM