2010-11-25 30 views

Répondre

3

Les cadres de scénarios BDD décrivent le comportement d'un système du point de vue de l'utilisateur. Que verra l'utilisateur quand l'exception est levée? Un message? Une boîte de message?

Si vous pouvez déterminer comment l'exception sera visible, cela peut vous aider à écrire le scénario.

+0

Je travaille actuellement sur une plate-forme à utiliser StoryQ dans les tests unitaires, où il est parfaitement valide qu'une exception est levée. Bien que StoryQ ait été conçu pour les tests fonctionnels BDD, point de vue utilisateur final, il peut également être réutilisé pour d'autres types de tests. – gregsdennis

+0

Dans la mesure du possible, j'utiliserais toujours le langage du client, même si l'implémentation réelle implique le lancement d'une exception. (Avez-vous envisagé de passer un gestionnaire d'exceptions à la place?) – Lunivore

+0

Il n'y a pas de client dans un scénario de test unitaire. Voir mon Q & A [ici] (http://stackoverflow.com/questions/15226666/modifying-or-configuring-output-with-storyq) – gregsdennis

4

En ce qui concerne le code actuel est concerné, dans la partie .Then de votre code de test, vous devez créer un Action ou Func pour établir ce qui a été mis à l'essai, puis dans la partie .Then du code, vous appeler ce code et tester le résultat. Ainsi, par exemple:

[Test] 
public void AnIllegalOperationThrowsAnException() 
{ 
    new Story("My Story) 
     .InOrderTo("Do achieve something") 
     .AsA("User") 
     .IWant("To carry out an operation") 
     .WithScenario("an exception occurs") 
     .Given(InitialConditions) 
     .When(TheIllegalActionIsTaken) 
     .Then(AnIllegalOperationExceptionIsThrown); 
} 

private void InitialConditions() 
{ 
} 

private Func<string> _operation; 

private void TheIllegalActionIsTaken() 
{ 
    _operation =() => return MyTestClass.DoesSomethingWrong(); 
} 

private void AnIllegalOperationExceptionIsThrown() 
{ 
    try 
    { 
     _operation.Invoke(); 
     Assert.Fail("An exception should have been thrown"); 
    } 
    catch (Exception ex) 
    { 
     Assert.That(ex, Is.InstanceOf<IllegalOperationException>(), "The wrong exception was thrown"); 
     Assert.That(ex.Message, Is.EqualTo("Ooops!"); 
    } 
} 

La gestion des assertions peut probablement être améliorée un peu, en particulier votre méthode de test ne renvoie pas de valeur. La bibliothèque FluentAssertions, par exemple, peut très bien avec une action (mais pas un Func), de sorte que le code serait:

_action.ShouldThrow<IllegalOperationException>().WithMessage("Ooops!");