Нельзя макетировать классы с помощью методов stati c, используя jest и ts-jest - PullRequest
0 голосов
/ 09 марта 2020

У меня есть два класса, которые имитируют простую операцию суммирования.

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 присутствует метод stati c, макет кода 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...

Если метод stati c удален из класса SumProcessor, все работает нормально.

Кто-нибудь может помочь?

1 Ответ

0 голосов
/ 10 марта 2020

, поскольку вы уже смоделировали класс SumProcessor с помощью jest.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)
  })
})

намного проще, верно?

...