¿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();
}
“`
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:
La macro
ASSERT_NO_FATAL_FAILURE
ejecutará el código dentro de los paréntesis, que es donde llamas agraph.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.