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.

¿Cómo se pueden probar los valores pasados al archivo EJS generado por Express?

Estoy tratando de probar mi aplicación web de express utilizando mocha y chai, pero no puedo entender cómo probar las solicitudes HTTP que son manejadas por express. Estoy utilizando ejs como mi motor de vistas, por lo que la mayoría de mis controladores de ruta se ven así:

const someRouteHandlerForGETRequest = async (request, response) => {
   // usualmente algunas consultas a la base de datos para obtener datos para mostrar en la vista
   const someQuery = await pool.query('SELECT * FROM table');
   var sampleData = someQuery.rows;

   response.render('ejspage', {
      user: request.session.username,
      sampleData: sampleData
   });
}

Debido a esto, creo que mi response.body es simplemente un archivo HTML o una cadena HTML (usando Postman estaba tratando de ver qué había en la respuesta, parecía que solo era el HTML para la vista).

¿Cómo puedo probar los datos que se pasan al archivo ejs (en este ejemplo, sampleData) que se devuelve desde la consulta a la base de datos node-pg?

Mi intento actual de prueba es este:

const { assert } = require('chai');
const chai = require('chai');
const chaiHttp = require('chai-http');
const app = require('../index');

chai.should();
chai.use(chaiHttp);

describe('/GET activeorders', () => {
  it('debería obtener órdenes activas', (done) => {
    chai.request('http://localhost:3000')
      .get('/activeorders')
      .end((err, res) => {
        res.should.have.status(200);
        done();
      });
  })
})

Básicamente, lo único que puedo probar es el estado de la respuesta, más allá de eso no puedo entender cómo probar ninguno de los valores que se devuelven de las consultas a la base de datos.

También intenté separar el modelo del controlador eliminando las consultas a la base de datos del controlador de ruta y, en cambio, haciendo que el controlador de ruta llame a una función que devuelva los resultados. Sin embargo, esto no resuelve mi problema porque usar chai-http para probar una solicitud HTTP aún no me da acceso a los datos ya que el controlador de ruta simplemente renderiza la página ejs con los datos.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para probar los datos que se pasan al archivo ejs, puedes utilizar el método assert.include proporcionado por Chai. Este método puede verificar si una subcadena está presente dentro de una cadena. En este caso, puedes comprobar si el valor de sampleData está presente en la respuesta HTML recibida desde el servidor.

    Aquí tienes un ejemplo de caso de prueba:

    describe('/GET activeorders', () => {
      it('debería obtener las órdenes activas', (done) => {
        chai.request('http://localhost:3000')
          .get('/activeorders')
          .end((err, res) => {
            res.should.have.status(200);
            assert.include(res.text, 'sampleData');
            assert.include(res.text, 'value1');
            assert.include(res.text, 'value2');
            done();
          });
      })
    })
    

    En este ejemplo, estamos utilizando res.text en lugar de res.body, ya que la respuesta del servidor es una cadena HTML. Luego utilizamos assert.include para comprobar si la cadena 'sampleData' está presente en la respuesta HTML. También podemos comprobar si los valores específicos de sampleData están presentes en la respuesta, utilizando assert.include con los valores correspondientes.

    Ten en cuenta que, dado que el valor de sampleData es un array, se convertirá en una cadena JSON antes de ser pasado al archivo ejs. Por lo tanto, en la respuesta HTML, aparecerá como una cadena como [{"id":1,"name":"value1"},{"id":2,"name":"value2"}].

Comments are closed.