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 puedo probar si std::terminate NO es llamado en googletest?

Tengo una afirmación personalizada como esta:

define MY_ASSERT(condition, message)                                       
do {                                                                         
  if (!(condition)) {                                                        
    std::cerr << "La aserción \"" #condition "\" falló en " << FILE       
              << " línea " << LINE << ": " << message << std::endl;       
    std::terminate();                                                        
  }                                                                        
} while (false)

Sé que puedo usar Death Tests para verificar si se llaman las afirmaciones. Sin embargo, quiero verificar si la afirmación en realidad no ocurre. Quiero que la prueba específica realmente FALLA en lugar de que la aplicación completa salga con el código 3 porque la afirmación falló. Aquí está la prueba que he escrito:

“`cpp
TEST_F(RenderGraphDeathTest, BuildOnlyCalledOnce) {
liquid::RenderGraph graph;

graph.addPass<emptyscope>(
"A", [](auto &builder, auto &scope) { builder.write("a-b", {}); },
noopExecutor);

graph.compile();

// Buscando algo como EXPECT_NOT_DEATH
graph.compile();
}
“`

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para verificar si la afirmación no ocurre y asegurarse de que la prueba falla si ocurre, puedes usar la macro ASSERT_NO_FATAL_FAILURE de GoogleTest. Esta macro no captura ninguna excepción o señal, pero fallará la prueba si la porción de código dentro de la macro genera un fallo fatal (como una falla de afirmación) y devuelve normalmente.

    Así es cómo puedes usarlo en tu prueba:

    TEST_F(RenderGraphDeathTest, BuildOnlyCalledOnce) {
      liquid::RenderGraph graph;
    
      graph.addPass<EmptyScope>(
          "A", [](auto &builder, auto &scope) { builder.write("a-b", {}); },
          noopExecutor);
    
      graph.compile();
    
      ASSERT_NO_FATAL_FAILURE({
        graph.compile();
      });
    }
    

    La macro ASSERT_NO_FATAL_FAILURE ejecutará el código dentro de los paréntesis, que es donde llamas a graph.compile() por segunda vez, y si ese código genera un fallo fatal (como una falla de afirmación), fallará la prueba inmediatamente. Si la ejecución devuelve normalmente, la prueba pasa.

    De esta manera, puedes asegurarte de que tu macro de afirmación personalizada esté haciendo su trabajo y fallando la prueba cuando debería, sin causar que toda la aplicación finalice.

Comments are closed.