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.

La conexión con un patrón singleton devuelve que el cliente ya está abierto.

Soy nuevo en el patrón Singleton y estoy intentando crear un singleton para obtener un cliente diferente cada vez que haga una llamada a él.

El código de mi singleton es el siguiente:

const Singleton = (() => {
    var instance;

    function createInstance(){
        let client  = new Client({
            user: config.db_postgres.user,
            password: config.db_postgres.password,
            database: config.db_postgres.name,
            host: config.db_postgres.host,
            //ssl: config.db_postgres.ssl            
        });
        //await client.connect();
        return client;
    }

    return{
        getInstance: function (){
            if (!instance){
                instance = createInstance();
            }
            return instance;
        }
    };
})();

module.exports.Singleton = Singleton;

Y cuando intento usar diferentes instancias del singleton es en esta prueba:

describe("Read information from database", () => {
    test("Test 1: Read information from table: tbl001_clientPG", async () => {
        let result;
        try{
            let clientPG = Singleton.getInstance();
            await clientPG.connect();
            result = await clientPG.query("select * from tbl010_country");
            await clientPG.end();
        }catch (err){
            console.log(err.stack);
        }
        expect(result.rows.length).toBeGreaterThan(0);
    });
    test("Test 2: Get data from table: tbl002_accesses", async() => {
        let result;
        try{
            let clientPG = Singleton.getInstance();
            await clientPG.connect();
            result = await clientPG.query("select * from tbl012_destinations");
            await clientPG.end();
        }catch (err){
            console.log(err.stack);
        }
        expect(result.rows.length).toBeGreaterThan(0);
    });
});

La primera prueba funciona correctamente, pero la segunda me devuelve el siguiente error:

Error: El cliente ya está conectado. No puedes reutilizar un cliente.

Y no sé por qué obtengo este error, porque el objetivo del Singleton es obtener instancias diferentes.

¿Qué estoy haciendo mal?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El patrón Singleton está diseñado para asegurarse de que solo se cree una instancia de una clase y que esta instancia sea accesible globalmente. En tu código, estás implementando correctamente el patrón Singleton para asegurarte de que solo se cree una instancia del objeto Cliente.

    Sin embargo, el mensaje de error que estás recibiendo se debe al hecho de que estás intentando reutilizar la misma instancia de cliente en ambos casos de prueba. El patrón Singleton asegura que solo se cree una instancia, pero no te impide utilizar la misma instancia varias veces.

    Para solucionar este problema, debes modificar tu código para crear una nueva instancia del cliente para cada caso de prueba. Puedes hacer esto eliminando la llamada a end() en tus casos de prueba, que cierra el cliente después de ejecutar la consulta. En su lugar, debes llamar a disconnect() para permitir que el cliente se reutilice en casos de prueba posteriores. Aquí tienes una versión actualizada de tus casos de prueba:

    describe(“Leer información de la base de datos”, () => {
    test(“Caso de prueba 1: Leer información de la tabla: tbl001_clientPG”, async () => {
    let result;
    try{
    let clientPG = Singleton.getInstance();
    await clientPG.connect();
    result = await clientPG.query(“select * from tbl010_country”);
    await clientPG.disconnect();
    }catch (err){
    console.log(err.stack);
    }
    expect(result.rows.length).toBeGreaterThan(0);
    });
    test(“Caso de prueba 2: Obtener datos de la tabla: tbl002_accesses”, async() => {
    let result;
    try{
    let clientPG = Singleton.getInstance();
    await clientPG.connect();
    result = await clientPG.query(“select * from tbl012_destinations”);
    await clientPG.disconnect();
    }catch (err){
    console.log(err.stack);
    }
    expect(result.rows.length).toBeGreaterThan(0);
    });
    });

    Al llamar a disconnect() en lugar de end(), estás permitiendo que el cliente se reutilice en casos de prueba posteriores. Esto asegurará que se cree una nueva instancia del cliente para cada caso de prueba, evitando el mensaje de error que estabas recibiendo.

Comments are closed.