Soy bastante nuevo en mocha.js, así que trato de obtener algo bastante básico y confiable que funcione con un ejemplo mínimo.
Estoy tratando de hacer una solicitud GET a una API JSON de ejemplo y ejecutar 3 pruebas en ella, todas deberían tener resultados diferentes, pero todas obtienen resultados diferentes a los esperados.
Además, estoy tratando de capturar y contar/informar sobre los errores que ocurren a través de las pruebas para generar detalles after()
que se ejecutan todas las pruebas para no saturar la interfaz de usuario.
Para las 3 pruebas que tengo, solo 1 debería pasar. El problema es que si incluyo una llamada .finally()
entonces todas pasan, si elimino la llamada .finally()
y solo tengo la llamada .catch()
entonces todas fallan. No estoy seguro de lo que me estoy perdiendo.
let errors = [] // After All output error details after((done) => { console.log("Total Errors: " + errors.length) // console.log(errors) done() }) // Example Test Suite describe("Example Test Suite", () => { it("#1 Should Pass on expect 200", (done) => { request("https://jsonplaceholder.typicode.com/") .get("todos/1") .expect(200) .catch(function (err) { errors.push(err) done(err) }) .finally(done()) }) it("#2 Should Fail on wrong content type", (done) => { request("https://jsonplaceholder.typicode.com/") .get("todos/1") .expect("Content-Type", "FAIL") .catch(function (err) { errors.push(err) done(err) }) .finally(done()) }) it("#3 Should Fail on contain.string()", (done) => { request("https://jsonplaceholder.typicode.com/") .get("todos/1") .then(function (err, res) { if (err) {done(err)} else { try { expect(res.text).to.contain.string("ThisShouldFail"); } catch(e) { errors.push({error: e, response: res}) done(err) } finally { done() } } }).catch(function (err) { errors.push(err) done(err) }) .finally(done()) }) })
He encontrado dos problemas con las pruebas proporcionadas
.finally(done())
finaliza la prueba como exitosa inmediatamente ya que .finally
espera una devolución de llamada y en su lugar se llama a done
, .finally(done)
o .finally(() => done())
podrían funcionar como usted pretendía a ellos.
interceptar los errores a través de try/catch es una práctica realmente mala y su implementación se tragará los errores potenciales mientras marca la prueba como aprobada, aunque falló, es mucho mejor usar el contexto de prueba de mocha porque este es un gancho afterEach, para ejemplo:
const errors = []; afterEach(function () { if (this.currentTest.state === "failed") { errors.push(this.currentTest.title) } });
Tampoco es necesario llamar terminado cuando se trabaja con promesas en moca. Una promesa puede ser simplemente devuelta y mocha pasará la prueba siempre y cuando la promesa se resuelva, falle de lo contrario (si no se detecta el error).
it("...", () => { return request(...).get(...).then(...) }
o usando async/await, que devuelve una promesa implícitamente
it("...", async () => { const result = await request(...).get(...) // Do assertions on result ... // No need to return anything here }