2010-11-15 4 views
0

Je suis en train de tester un code C++ sur un cadre Nunit mais je continue à obtenir l'exception suivanteGestion des exceptions pour les tests unitaires en C++

System.Runtime.InteropServices.SEHException : External Component has thrown an exception. 

qui est censé être tout à fait normal (je suppose) de toute façon je veux ignorer il. (À savoir l'utilisation ExpectedException) Ceci est mon fichier .h

[Test, Description("Tests if an Entity has been successfully Locked")] 
void test_LockOperation(); 

et le fichier .cpp

void TestDmObstacles::test_LockOperation() 
{ 
    lockVal = DbtoDmObstaclesAdapter::lock(CmnGuid::parseString(L"3B6DB8F8-4BA7-DD11-B6A7-001E8CDE165C")); 
    //When lock is successful the lockVal is 0 
    Assert::AreEqual(0, lockVal); 
} 

Je veux utiliser ExpectedException mais je ne sais pas comment le faire en C++. J'ai essayé le try/méthode de capture aussi bien, mais ça n'a pas marché (je viens de mettre le Assertion dans le bloc catch)

PS: Je ne peux pas utiliser un autre cadre, il doit être Nunit

EDIT

Voici l'approche try/catch je

void TestDmObstacles::test_LockOperation() 
{ 
    try 
    { 
     lockVal = DbtoDmObstaclesAdapter::lock(CmnGuid::parseString(L"3B6DB8F8-4BA7-DD11-B6A7-001E8CDE165C")); 
    } 
    catch (...) 
    { 
     //Assert::Fail(); 
     Assert::AreEqual(0, lockVal); 

    } 
} 
+0

_ "Je ne peux pas utiliser un autre framework, ça doit être Nunit" _ - Je suis toujours curieux, * pourquoi * !? – stakx

+0

Je suis au travail et je ne suis pas autorisé à télécharger ou installer d'autres applications qui ne sont pas déjà sur ma machine! ... si simple et stupide que cela – Reda

+0

Pouvez-vous donner la méthode try/catch que vous avez utilisée. Attraper une exception est vraiment la seule façon sensée de tester qu'elle a été lancée, mais peut-être que vous ne l'avez pas fait correctement. – beldaz

Répondre

2

L'exception est-elle attendue ou est-ce l'exception acceptable?

S'il est prévu , votre cadre de test unitaire devrait avoir une sorte d'API qui vous permet d'affirmer l'exception attendue, et échouent au test si elle ne se produit pas. Un chalut rapide à travers la documentation donne l'incantatoire:

[ExpectedException("System.ArgumentException")] 

(remplacer System.ArgumentException à l'exception que vous vous attendez.)

Si l'exception est simplement acceptable, je dirais que ce soit votre code ou votre test est cassé. Un test unitaire consiste à tester que les choses attendues se produisent. S'il y a un résultat dans votre test que seulement peut donner un résultat particulier, alors vous ne testez pas une vue cohérente de l'unité de test à test. Par conséquent, vous ne le testez pas vraiment.

Cela peut indiquer, par exemple, que votre code fuit une exception inattendue qu'il devrait gérer à la place.

+0

thx Kaz c'est la forme que je voulais voir. – Reda

0

Votre exemple de code ne correspond pas à ce que vous essayez d'atteindre: si l'exception est prévu, que l'attraper est pas censé faire échouer le tester.

Notez que je ne recommanderais pas (du tout) pour le test à catch (...): toute exception levée induira le même résultat de test, ce dont je doute est ce que vous voulez.

+0

tu as raison icecrime Je viens de le copier d'un autre test c'est pourquoi!Je l'ai édité maintenant. En ce qui concerne le catch (..) je l'ai juste essayé de savoir où est l'erreur, je vais le changer une fois que je trouve un bon moyen d'affirmer – Reda