Tengo la clase B que depende de la clase A. Quiero probar un método de la clase B que llama internamente a un método de la clase A. Ahora, quiero probar unitariamente mi método de la clase B burlándome de la clase A.
Mi estructura de código:
class A { getSomething() { return "Something"; } } class B { constructor(objectOfClassA: A) { this._objectOfClassA = objectOfClassA; } functionofClassBToTest() { const returnValueFromClassA = this._objectOfClassA.getSomething(); return returnValueFromClassA; } }Lo que he probado hasta ahora:
import .... import { mocked } from 'jest-mock'; jest.mock("./A", () => { return { A: jest.fn().mockImplementation(() => { return { getSomething: getSomethingMock } }) }; }); const getSomethingMock = jest.fn().mockImplementation(() => { return "Mock value"; }); const mockA = mocked(A, true); test("test functionofClassBToTest", () => { const classBToTest = new B(mockA); expect(classBToTest.functionofClassBToTest.toStrictEqual("Mock value"); });Este es el error que me sale:
TypeError: this._objectOfClassA.getSomething is not a functionNota: no quiero inicializar un objeto de clase A dentro de mi función de prueba. Solo quiero burlarme de la clase.
También encontré algunas publicaciones anteriores en SO: Post1 y Post2 pero nada funcionó.
ACTUALIZACIÓN: este problema se resolvió gracias a la respuesta de James a continuación . Para burlarse de las clases con miembros privados, he hecho otra pregunta SO . Por favor, léalo.
Dado que Typescript tiene un tipo estructural , debería ser posible simplemente construir un objeto literalmente que coincida con la interfaz de la clase A y pasarlo a la clase B.
Por ejemplo:
const mockA: jest.Mocked<A> = { getSomething: jest.fn() }; const b = new B(mockA); expect(mockA.getSomething) .toHaveBeenCalled();Esto no debería generar errores de tipo dado que mockA coincide exactamente con la interfaz de la clase A.
Para simular el valor de retorno de los métodos de A, consulte la simulación de funciones individuales con Jest.
Esto demuestra ser más simple y sucinto que intentar burlarse de todo el módulo. Dado que ha utilizado IoC como patrón, no es necesario simular el módulo.
También tienes un error tipográfico. La clase B se asigna a una variable de instancia con solo un guión bajo, pero luego llama al método en una variable de instancia con dos guiones bajos.