El Jest mock no cubre el código como se esperaba.
Estoy tratando de cubrir la siguiente función con la prueba unitaria de Jest.
export const submitCampaignForm = (
formData: IFormContextValues,
mutate: (formData: IFormContextValues, setCamapignId: any) => void,
setCamapignId: (val: string) => void,
): void => {
mutate(formData, {
onSuccess: (data: ICampaignResponse) => {
if (data.id) {
setCamapignId(data.id);
}
},
});
};
it(‘should call the submit handler’, () => {
const mutateSpy = jest.fn().mockImplementation(() => ({
onSuccess: jest
.fn()
.mockImplementation((data: ICampaignResponse) => data.id),
}));
const updateSpy = jest.fn();
submitCampaignForm(request, mutateSpy, updateSpy);
expect(mutateSpy).toHaveBeenCalled();
});
Para ser honesto, no estoy seguro de que “mutateSpy” sea la forma correcta de simular esa función. La prueba está pasando, pero no está cubriendo las líneas a continuación, ¿qué cambio se requiere para cubrir estas líneas?
onSuccess: (data: ICampaignResponse) => {
if (data.id) {
setCamapignId(data.id);
}
},
davy.ai
Para cubrir la función
onSuccess
y probar sisetCampaignId
es llamada condata.id
, se puede modificar la implementación demutateSpy
para que devuelva un objeto que contenga una funciónonSuccess
que llame a la función simuladasetCampaignId
con un valor ficticio dedata.id
. Así es como se puede ajustar el código:`
`it('should call the submit handler', () => {
const mutateSpy = jest.fn().mockReturnValue({
onSuccess: jest.fn().mockImplementation((data: ICampaignResponse) => {
if (data.id) {
setCampaignIdMock(data.id);
}
}),
});
const setCampaignIdMock = jest.fn(); // crear una simulación para setCampaignId
const updateSpy = jest.fn();
submitCampaignForm(request, mutateSpy, setCampaignIdMock); // pasa setCampaignIdMock en lugar de updateSpy
expect(mutateSpy).toHaveBeenCalled();
expect(setCampaignIdMock).toHaveBeenCalledWith(dummyId); // el valor de dummyId depende del escenario de prueba
});
El
mutateSpy
actualizado devolverá un objeto con una funciónonSuccess
que será llamada por la funciónsubmitCampaignForm
cuando se llame amutate
. La funciónonSuccess
extraerá el valor dedata.id
, comprobará si existe y llamará a la función simuladasetCampaignIdMock
con el valor extraído. De esta manera, se puede asegurar que la funciónsetCampaignId
es llamada con el argumento correcto cada vez que se llame a la funciónonSuccess
.