Dado que tengo el siguiente código:
public returnData(): Promise<any> { return new Promise((resolve) => { setTimeout(() => { resolve({ data: true, }); }, 2000); }); }
Ahora, actualmente mi prueba unitaria hace con éxito:
it('should return data', async function () { const responseMock = { data: true, }; await expectAsync(component.returnData()).toBeResolvedTo(responseMock); });
Pero hay un problema obvio: la prueba tarda más de 2000ms, lo cual es inaceptable. Quiero poder probar esto sin necesidad de esperar el tiempo. He probado muchas soluciones diferentes, como las siguientes:
it('should return data', async function () { jasmine.clock().install(); const responseMock = { data: true, }; setTimeout(() => { expectAsync(component.returnData()).toBeResolvedTo(responseMock); jasmine.clock().tick(2000); }, 2000); jasmine.clock().uninstall(); });
La prueba anterior pasó con gran sincronización, pero cuando cambio el valor de responseMock
por cualquier otra cosa, todavía pasa, por lo que realmente no funciona...
¿Cuál es la clave para probar este caso específico, sin la necesidad de esperar el tiempo setTimeout?
¿Por qué estás ejecutando las expectativas en un setTimeout
? Tal vez no necesitamos eso.
Prueba esto:
it('should return data', async function () { jasmine.clock().install(); const responseMock = { data: true, }; // call the method that returns a promise and have a handle on its promise const promise = component.returnData(); // make 2 seconds pass in a fake way jasmine.clock().tick(2000); // await the promise const result = await promise; // assert the result expect(result).toEqual(responseMock); jasmine.clock().uninstall(); });
Veo que estás usando component.
y lo más probable es que estés usando Angular. Si está usando Angular, uso fakeAsync/tick
para el tiempo y las promesas.
Echa un vistazo a fakeAsync/tick
aquí .
// it('should return data', fakeAsync(() => { const responseMock = { data: true, }; // call the method that returns a promise and have a handle on its promise const promise = component.returnData(); // make 2000 pass in a fake way tick(2000); promise.then(result => { expect(result).toEqual(responseMock); expect(1).toBe(2); // delete this - make sure the test fails to know we made it here }); }));