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.
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 bloqueif
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: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.