2010-11-19 4 views
1

J'utilise NUnit et Rhino Mocks. J'utilise la syntaxe AAA et je fais l'arrangement et l'acte dans la méthode d'installation, et chaque méthode de test est un assert. Comme on pouvait s'y attendreExpectedException dans NUnit SetUp

[TestFixture] 
public class When_subSystem_throws_exception 
{ 
    SomeClass subject; // System under test 

    [SetUp] 
    public void Setup() 
    { 
     // Arrange 
     IDependency dependency = MockRepository.GenerateStub<IDependency>(); 
     dependency.Stub(m => m.DoStuff()).Throw(new Exception()); // This method is called from within SomeMethod() 

     subject = new SomeClass(dependency); 

     // Act 
     subject.SomeMethod("Invalid Input"); 
    } 

    // Assert 

    [Test] 
    public void should_log_an_exception_to_the_logger() 
    { 
     // Do stuff to verify that an exception has been logged 
    } 

    // More tests 
} 

, le code dans SomeMethod() renvoie une exception (comme prévu), qui fait de tous les tests échouent (indésirables). Je contourne cela en faisant

try 
{ 
    // Act 
    subject.SomeMethod("Invalid Input"); 
} 
catch(Exception ex) 
{ 
    // Swallow, this exception is expected. 
} 

Mais c'est juste moche.

Ce que je voudrais être en mesure de faire est

[SetUp] 
[ExpectedException] // <-- this works for Test methods, but not for SetUp methods 
public void Setup() 
{ 
    // etc... 
} 

, mais je ne peux pas trouver quelque chose comme ça.

Connaissez-vous quelque chose?

Répondre

2

Je ne pense pas que l'utilisation d'un attribut comme ExpectedException est une bonne idée. SetUp est de préparer quelque chose pour les méthodes de test, il ne devrait pas jeter d'exception. S'il doit lancer, et que vous souhaitez limiter le numéro de ligne de code. Ensuite, mettez-les dans une ligne comme ci-dessous:

try { subject.SomeMethod("Invalid Input"); }catch { } 
+0

Comment pouvez-vous assurer que l'exception a été lancée? – Simone

+0

@Simone désolé, je ne comprends pas ce que vous dites. –

+0

Si vous voulez tester si l'exception est levée ou non, comment pouvez-vous vérifier cela avec un tel code? s'il est lancé, vous ne faites rien de différent que s'il n'est pas lancé. – Simone

2

Cela ne fonctionne pas dans le programme d'installation pour une raison, pas à cause du bogue de NUnit.

C'est une très mauvaise pratique pour un test d'unité de lancer des exceptions dans la méthode SetUp. Si vous testez un scénario particulier où une exception est le résultat attendu, cela doit être fait dans une méthode [Test]. Vous devriez réorganiser votre code par la suite.

+0

Je ne sais pas pourquoi ce serait une mauvaise pratique. Comme je fais mes "Actes" dans le SetUp (c'est un donné pour moi), les exceptions attendues qui sont lancées dans ces "Actes" sont naturellement aussi à l'intérieur du SetUp. Je cherche juste une solution plus élégante que l'essayage. – dvdvorle

1

Votre étape "act" doit être dans la méthode de test et non dans la configuration.

La configuration sert à configurer des conditions préalables et des objets communs pour le ou les tests, c'est-à-dire des étapes d'arrangement commun ou répété. Chaque méthode d'essai doit «agir» et «s'affirmer» individuellement (et peut également nécessiter des étapes «d'arrangement» supplémentaires spécifiques à l'essai).

+0

Hmm, je suppose que mon test unitaire n'est pas vraiment standard, n'est-ce pas? Je pense que "NUnit meets BDD" et ça marche pour moi. C'est la première fois que j'ai un "problème" avec ça, et c'est résolu par un simple try-catch. Ce que je cherche est une solution plus élégante que l'essai. L '"acte" reste dans le SetUp: p. – dvdvorle

+0

alors allez avec try-catch, c'est la solution la plus "élégante" (et votre seule option). – Simone