2017-01-12 9 views
0

J'utilise Catch pour écrire des tests unitaires et j'ai rencontré un problème où mon test échoue car une exception est levée, même si j'utilise REQUIRE_THROWS_AS. Ceci est mon test:Catch not catching exception

SECTION("Get column index for inexistent name") { 
    REQUIRE_THROWS_AS(result->column_index("inexistent"), std::out_of_range); 
} 

Et c'est l'exception que je reçois sur ma console:

$ tests/unit_tests "Test Result" 
libc++abi.dylib: terminating with uncaught exception of type std::out_of_range: Name not found. 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
unit_tests is a Catch v1.5.8 host application. 
Run with -? for options 

------------------------------------------------------------------------------- 
Test Result 
    Query empty table 
    Get column index for inexistent name 
------------------------------------------------------------------------------- 
<path to file>:22 
............................................................................... 

<path to file>:46: FAILED: 
due to a fatal error condition: 
    SIGABRT - Abort (abnormal termination) signal 

=============================================================================== 
test cases: 1 | 1 failed 
assertions: 8 | 7 passed | 1 failed 

Si je comprends Catch cette exception est exactement ce que je suis en train de prendre à droite?

+0

Je ne sais pas Catch, il semble que l'exception soit levée avant que 'REQUIRE_THROWS_AS' n'obtienne une chance de faire quoi que ce soit. Vous avez probablement besoin de quelque chose comme 'REQUIRE_THROWS_AS (résultat-> column_index," inexistant ", std :: out_of_range);' donc 'REQUIRE_THROWS_AS' a une chance de faire un bloc try-catch pour vous. – nwp

+0

Avez-vous essayé de passer le test? Comme nwp l'a dit, cela prouvera si votre exception est lancée là où vous pensez qu'elle est lancée – UKMonkey

+1

Il semble que vous ayez intercepté l'exception non à l'endroit pointé, Essayez temporairement de remplacer la macro avec try {} catch() {} catch (...) {} et le déboguer. –

Répondre