El objeto esperado/recibido son iguales pero la prueba falla.
Tengo una clase contenedor A que instancia otra clase B:
class A {
constructor(){
this.initClassB()
}
private initClassB(): void{
const options = {id : 0, ... etc}
new B(options)
}
}
En mi archivo de prueba, instancio la clase A y simulo la clase B:
import { mocked } from 'ts-jest/utils';
import { ClassA } from '../ClassA';
import { ClassB } from '../ClassB';
jest.mock('../ClassB');
const mockedClassB = mocked(ClassB, true);
describe('clase B', () => {
it('verifica si los requisitos mínimos están correctos', () => {
const { text, url } = ClassA.props.options;
const expectedOptions = {
event: ClassA.event,
id: ClassA.getDefaultSiteId(),
loadContent: () => '',
loader: ClassA.loader,
text: text,
url: url,
};
// la prueba falla porque lo Esperado/Recibido son idénticos
expect(mockedClassB).toHaveBeenCalledWith(expectedOptions)
// falla con error: serializa a la misma cadena
expect(mockedCKTable.mock.calls[0][0]).toMatchObject(expectedOptions);
});
});
Este es el error con el método toHaveBeenCalledWith
:
Este es el error con el método toMatchObject
:
Y las versiones de las dependencias:
{
"@types/jest": "^26.0.24",
"ts-jest": "^27.0.4",
"jest": "^27.0.6",
"typescript": "~4.1.3",
"@types/jest": "^26.0.24"
}
¿Dónde estoy cometiendo un error?
davy.ai
Hay un par de problemas con el caso de prueba proporcionado.
En primer lugar, cuando llamas a
jest.mock('../ClassB')
, estás simulando todo el móduloClassB
. Por lo tanto, al intentar simularClassB
usandoconst mockedClassB = mocked(ClassB, true)
, en realidad no estás simulando la instancia deClassB
creada porinitClassB()
de la clase A.Para simular la instancia de
ClassB
creada porinitClassB()
, puedes modificar tu prueba de la siguiente manera:Aquí, estamos simulando la instancia de
ClassB
devolviendo una función que actúa como el constructor deClassB
. Luego, podemos utilizarjest.fn()
para simular esa función.En segundo lugar, cuando llamas a
expect(mockedClassB).toHaveBeenCalledWith(expectedOptions)
, estás comprobando simockedClassB
se llama conexpectedOptions
. Sin embargo, dado queinitClassB()
crea una nueva instancia deClassB
, necesitas obtener una referencia a esa instancia en tu prueba y comprobar si esa instancia se llama conexpectedOptions
.Puedes obtener una referencia a la instancia de
ClassB
creada porinitClassB()
creando una propiedad enClassA
que contenga una referencia al objeto instanciado, de la siguiente manera:Luego, modifica tu prueba para utilizar
mockedBConstructor
en lugar demockedClassB
, y para comprobar siclassBInstance
se llama conexpectedOptions
, de la siguiente manera:Aquí, estamos comprobando si el método
algunMetodo
declassBInstance
se llama conexpectedOptions
. Ten en cuenta que debes reemplazaralgunMetodo
con el nombre real del método enClassB
que se llama conoptions
.Con estos cambios, tu prueba debería ser capaz de simular correctamente
ClassB
y comprobar si la instancia deClassB
creada porinitClassB()
se llama con las opciones esperadas.