es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Si bien la prueba unitaria pasa como se esperaba, el informe de cobertura indica que no está cubierto.

Dada una clase y un método como este:

export default class Router {
    constructor(private request: Request) {
        this.request = request;
    }

    public async handle(): Promise<string |="" undefined=""> {
        const pathname = new URL(this.request.url).pathname;

        if (pathname !== "/requests" && pathname !== "/shipments") {
            throw new ValidatorError(
                "ERR_HTTP_PATH",
                "Not Found",
                404,
            );
        }

        ...
    }
}

Y una prueba unitaria como esta:

Deno.test("router should throw when endpoint is not /requests nor /shipments", async () => {
    const fakeError = {
        message: "ERR_HTTP_PATH",
        cause: "Not Found",
        status: 404,
    };

    const stub = sinon.stub(Router.prototype, "handle");
    stub.rejects(fakeError);

    const fakeRequest = new Request("http://fakerequest:5000/fakerequest");

    const path = new URL(fakeRequest.url).pathname;

    asserts.assertNotEquals(path, "/requests");
    asserts.assertNotEquals(path, "/shipments");

    await new Router(fakeRequest)
        .handle()
        .catch(err => asserts.assertEquals(err, fakeError))
        .finally(() => {
            asserts.assert(stub.called);
            stub.restore();
        });
});

Esta prueba pasa. ¿Pero por qué el informe de cobertura indica que no está cubierta?

12 if (pathname !== "/requests" && pathname !== "/shipments") {
  13 |       throw new ValidatorError(
  14 |         "ERR_HTTP_PATH",
  15 |         "Not Found",
  16 |         404,
  17 |       );
  18 |     }

He verificado que la cobertura no está en caché internamente y que no lo está. De hecho, la documentación dice que –coverage es una representación precisa de la cobertura de código del motor V8.

¿Qué estoy haciendo mal aquí?

¿Debo necesariamente simular la clase ValidatorError aunque haya simulado el método handle para lanzar y reemplazar el comportamiento de la clase?

¿Qué debo hacer para que esto aparezca en el informe de cobertura?

Gracias.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    La razón por la cual los informes de cobertura de pruebas lo marcan como no cubierto es porque el código de lanzamiento de errores se está omitiendo debido a que el pathname es o bien "/requests" o "/shipments". Esto significa que el bloque if que contiene el código de lanzamiento de errores no se ejecuta durante la prueba, por lo tanto, no aumenta la cobertura.

    Para cubrir esto en el informe de cobertura, puedes modificar el caso de prueba para asegurarte de que el pathname no sea ni "/requests" ni "/shipments". Esto se puede hacer pasando una URL falsa de solicitud que no contenga estas rutas. Por ejemplo:

    const fakeRequest = new Request("http://fakerequest:5000/otherpath");
    

    Al hacer esto, la prueba ejecutará el código de lanzamiento de errores, cubriéndolo en el informe de cobertura.

    Con respecto a la clase ValidatorError, no es necesario simularla (stub) ya que no se está probando directamente. Sin embargo, es posible que desees considerar probarla por separado en su propio caso de prueba unitario.

Comments are closed.