Comment utiliser StoryQ pour tester un scénario où une exception est attendue?Scénario StoryQ où une exception est attendue
Répondre
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.
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!");
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
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
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