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 probar una clase con Google Test?

Estoy aprendiendo Google Test, tengo una clase y quiero probar su función miembro, a continuación está el código de muestra:

class B {
    //......
};
class A {
public:
    //.....
    void add(string s, B* ptrb) { m.insert(s, ptrb); }
    void remove(string s) { 
        auto it = m.find(s);
        if (it != m.end())
            m.erase(it); 
    }
    B* operator[](string s)
    {
        auto it = m.find(s);
        if (it != m.end())
            return (*it).second;
    }
    //.....
protected:
    map<b*> m;
    //.....
}

si quiero probar add de la siguiente manera:

class mygtest : public ::testing::Test
{
protected:
    //....configuración
    //....limpieza
    A a;
};
TEST_F(mygtest, testadd)
{
    B b1;
    B b2;
    a.add("1", &b1);
    a.add("2", &b2);
    //... ¿cómo debo continuar?
    EXPECT_EQ(.....) //¿comparar con qué?
}

Esta es la primera pregunta.

La segunda pregunta es:

En algunas condiciones, tengo que llamar a otra función miembro para obtener un valor primero y luego usar EXPECT_EQ para probar la función miembro actual, ¿cómo probar una función sin usar otra función miembro? ¿Si es necesario?</b*>

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Respuesta

    Primera pregunta

    Para probar la función add, la forma más fácil es recuperar el puntero B* insertado en el mapa y luego compararlo con el valor esperado usando EXPECT_EQ. Aquí hay un ejemplo:

    TEST_F(mygtest, testadd)
    {
        B b1;
        B b2;
        a.add("1", &b1);
        a.add("2", &b2);
    
        // Recuperar los punteros del mapa
        B* ptr_b1 = a["1"];
        B* ptr_b2 = a["2"];
    
        // Comparar los punteros con los valores esperados
        EXPECT_EQ(&b1, ptr_b1);
        EXPECT_EQ(&b2, ptr_b2);
    }
    

    Segunda pregunta

    Idealmente, cada función miembro se debería probar de forma independiente, sin depender de otras funciones miembro. Sin embargo, en algunos casos, puede ser necesario llamar a otras funciones miembro para configurar el entorno de prueba.

    Si necesitas llamar a otra función miembro para obtener un valor antes de probar la función miembro actual, puedes hacerlo en la función SetUp del fixture mygtest. Aquí hay un ejemplo:

    class mygtest : public ::testing::Test
    {
    protected:
        // Configurar el entorno de prueba
        void SetUp() override
        {
            // Llamar a otra función miembro para establecer un valor
            B b1;
            a.add("1", &b1);
            value = a["1"]->get_value(); // se asume que hay una función get_value() en B
        }
    
        A a;
        int value;
    };
    
    TEST_F(mygtest, testfunction)
    {
        // Usar el valor establecido en la función de configuración
        EXPECT_EQ(42, a.function(value));
    }
    

    Ten en cuenta que generalmente es mejor mantener cada caso de prueba lo más sencillo posible, por lo que si puedes evitar depender de otras funciones miembro, es preferible hacerlo.

Comments are closed.