2010-10-18 7 views
2

Si je veux tester qu'une méthode lève une exception d'un type particulier, l'attribut ExpectedException de NUnit ne se soucie pas du type réel; si je jette une exception générique avant l'appel de méthode, le test passe:TestCustomException de NUnit ne se soucie pas du type d'exception

[Test, ExpectedException(typeof(TestCustomException))] 
    public void FirstOnEmptyEnumerable() 
    { 
     throw new Exception(); // with this, the test should fail, but it doesn't 
     this.emptyEnumerable.First(new TestCustomException()); 
    } 

Si je veux vérifier que le test jette le type d'exception exacte, je dois faire manuel quelque chose comme ceci:

[Test] 
    public void FirstOnEmptyEnumerable() 
    { 
     try 
     { 
      throw new Exception(); // now the test fails correctly. 
      this.emptyEnumerable.First(new TestCustomException()); 
     } 
     catch (TestCustomException) 
     { 
      return; 
     } 

     Assert.Fail("Exception not thrown."); 
    } 

Ai-je oublié quelque chose?

Répondre

4

Je n'ai jamais utilisé ExpectedException, donc je n'ai aucune expérience à partager à ce sujet. Une option consiste à affirmer qu'il se lance directement dans le test. Quelque chose comme ceci:

[Test] 
public void FirstOnEmptyEnumerable() 
{ 
    Assert.Throws<TestCustomException>(() => this.emptyEnumerable.First(new TestCustomException())); 
} 

Je trouve cette approche plus lisible que vous testez l'exception exactement où vous vous attendez que cela se produise au lieu de dire « quelque part dans cette fonction I, sauf une exception à jeter ».

+0

+1 Beaucoup plus belle solution :) –

+0

C'est une bonne idée et je pense que ça ira dans la plupart des cas, mais j'essaie d'éviter d'attraper des exceptions dans les affirmations comme un test. J'aime la distinction entre les deux (exception et résultat) et de plus je la sens compliquée mes tests (deux types de tests) – Neowizard

+0

Je suppose que c'est une question de préférences. Je préfère cette approche. Merci Jackson Pope! – stiank81

0

je teste toujours la représentation de chaîne de l'exception .: par exemple

[Test, ExpectedException("Your.Namespace.TestCustomException")] 
public void FirstOnEmptyEnumerable() 
{ 
    throw new Exception(); // with this, the test should fail, but it doesn't 
    this.emptyEnumerable.First(new TestCustomException()); 
} 

Ce qui semble fonctionner très bien pour moi.

+1

En général, il est recommandé de ne pas utiliser des chaînes comme celui-ci . Si vous changez le nom de votre exception, le test serait invalide. Heureusement, dans ce cas, le test échouerait, vous devriez donc le voir et mettre à jour le ExceptedException dans le test. Cependant, c'est difficile de passer par là. Avantage en utilisant la chaîne, c'est que vous n'avez pas besoin de référencer l'ensemble qui contient la définition d'exception. – stiank81

+0

Merci pour l'info. Si la méthode des chaînes n'est pas recommandée et que la méthode 'typeof() ne fonctionne pas pour l'OP, que recommandez-vous? –

+0

J'ai posté une réponse à comment je le ferais .. S'il vous plaît continuer à utiliser des définitions de chaîne si vous êtes à l'aise avec elle, mais juste être conscient qu'il pourrait vous mordre un jour. – stiank81

0

Si vous souhaitez utiliser la signature ExpectedException (string), la meilleure pratique serait d'utiliser typeof (Exception) .Nom et typeof (Exception) .Namespace

Questions connexes