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 inyectar una función stub al usar server.inject en Hapi.js

Tengo un proyecto de hapijs que está utilizando el complemento hapi-mongodb.

En el controlador estoy utilizando el complemento hapi-mongodb para realizar llamadas a la base de datos. Ver a continuación:

internals.getById = async (request, h) => {

try {

    const db = request.mongo.db;
    const ObjectId = request.mongo.ObjectID;

    const query = {
        _id: ObjectId(request.params.id)
    };

    const record = await db.collection(internals.collectionName).findOne(query);

    //etc.....
}

Quiero poder probar esto utilizando server.inject(), pero no estoy seguro de cómo falsificar el request.mongo.db y el request.mongo.ObjectID.

it('should return a 200 HTTP status code', async () => {

    const server = new Hapi.Server();

    server.route(Routes); //Esto proviene de un archivo requerido

    const options = {
        method: 'GET',
        url: `/testData/1`
    };

    //falsificar request.mongo.db y request.mongo.ObjectID

    const response = await server.inject(options);

    expect(response.statusCode).to.equal(200);
});

¿Alguna idea?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para simular los objetos request.mongo.db y request.mongo.ObjectID en tu prueba server.inject(), puedes usar una biblioteca como sinon para crear objetos simulados. Aquí tienes un ejemplo de cómo puedes modificar tu prueba para lograr esto:

    it('debería devolver un código de estado HTTP 200', async () => {
    
        const server = new Hapi.Server();
    
        server.route(Routes); // Esto proviene de un archivo requerido
    
        const options = {
            method: 'GET',
            url: `/testData/1`
        };
    
        const dbMock = {
            collection: sinon.stub().returnsThis(),
            findOne: sinon.stub().resolves({ /* registro simulado */ })
            // cualquier otro método que necesites simular
        };
    
        const ObjectIdMock = sinon.stub().returns('ID de objeto simulado');
    
        const requestMock = {
            mongo: {
                db: dbMock,
                ObjectID: ObjectIdMock
            }
        };
    
        const response = await server.inject(Object.assign({}, options, { 
            credentials: {}, // añade esto para evitar errores de server.auth.mode
            artifacts: {}, // añade esto para evitar errores de server.auth.mode
            request: requestMock // añade el objeto simulado de request a las opciones
        }));
    
        expect(response.statusCode).to.equal(200);
    });
    

    En este ejemplo, creamos un objeto dbMock que tiene los mismos métodos que un objeto mongo.db real, pero devuelve datos simulados en su lugar. También creamos una función ObjectIdMock que devuelve una cadena para reemplazar la implementación real de request.mongo.ObjectID.

    Luego, creamos un objeto requestMock que tiene una propiedad mongo con nuestros objetos simulados como valores. Por último, agregamos requestMock a las opciones enviadas a server.inject(), usando Object.assign() para combinarlo con el objeto de opciones original que definimos.

    Esto debería permitirte probar tu controlador simulando los objetos mongo.db y mongo.ObjectID.

Comments are closed.