2010-11-02 8 views
3

Comme tous les bons programmeurs, j'essaie d'obtenir certaines choses directement lorsque j'utilise TDD avec MS Test. Je suis la disposition de base Arrange, Act, Assert, et quelque chose semble trop compliqué pour mon code Act. Je pars du principe qu'il ne devrait y avoir qu'une action dans la ligne de la Loi. Donc, étant donné mon exemple de code ci-dessous, est-ce que je sors de la piste en effectuant d'abord une action et en testant ensuite son état? Merci pour la contribution.TDD avec MS Test

[TestMethod] 
    public void TheCountOfAllRecordsIsGreaterThanZero() 
    { 
     //Arrange 
     var auditLog = new AuditMasterClass(); 

     //Act 

     //Create a new record in a local list of objects 
     auditLog.LogAction("MyPersonName", DateTime.Now, "Stuff", "MoreStuff", 
            "Desc", 
            "Comments", true, false, 
            "UndoStatement"); 

     //Return the count of objects in the local list 
     var count = auditLog.GetCommentCount(); 

     //Assert 
     Assert.IsTrue(count > 0); 
    } 

Répondre

5

Le test semble bien pour moi - je ne serais pas trop dogmatique ici, mais si elle vous fait vous sentir mieux, vous pouvez marquer la ligne: var count = auditLog.GetCommentCount(); dans le cadre de la phase d'affirmation;)

Une chose Je voudrais changer dans le test est l'assertion réelle - utiliser Assert.AreNotEqual(0, count) ou Assert.IsTrue(count > 0, string.Format("Count was not greater than 0, it was {0}", count)) - de cette façon, vous obtiendrez un meilleur message d'erreur au cas où l'assertion échoue.

+0

Merci pour votre contribution Dror! Fait du bon sens. –

+1

Juste pour l'avoir dit: Assert.AreEqual(0, count) et Assert.IsTrue(count > 0) produira des résultats différents. Assert.GreaterThan(0, count) (ou peu importe avec MStest) fera l'affaire –

+0

#Simen Echholt Mon erreur - Je corrigerai ma réponse –

5

Je ne vois aucun problème avec ce que vous avez fait. Je tendance à inline la variable count et simplement

Assert.IsTrue(auditLog.GetCommentCount() > 0); 

mais ce n'est pas significativement différent. Votre test, tel qu'il est écrit, indique que vous attendez que LogAction() soit appelé avec un ensemble particulier de paramètres, il y aura un ou plusieurs commentaires dans le journal. C'est clair. Une chose que j'aime faire est d'affirmer le contraire de mon affirmation avant l'action, donc je sais que l'action est vraiment ce qui a provoqué la condition. Ce serait, bien sûr, être:

Assert.IsTrue(auditLog.GetCommentCount() == 0); 

juste avant votre acte.

+0

Merci pour votre contribution Carl! –

+0

Concernant tester que GetCommentCount() renvoie 0 avant de faire quoi que ce soit: Ne serait-il pas plus approprié de tester dans un autre test séparé? Vous êtes censé tester que la méthode GetCommentCount() renvoie une valeur supérieure à zéro étant donné un état S. Ce qu'elle renvoie lorsqu'elle n'est pas dans l'état S n'est pas important dans ce contexte –

+0

@Simen, Non, pas du tout. Supposons que GetCommentCount() renvoie 5 avant et après l'action. Le test tel que rédigé à l'origine passerait, mais il ne testerait pas réellement l'action. Vous pourriez mettre n'importe quel code - ou aucun - qui n'affecte pas le compte de commentaire dans l'action, et le test passerait toujours. L'assertion de pré-action n'est pas de tester comment le code avant son comportement, mais plutôt d'établir la ligne de base de sorte que l'assertion finale constitue un changement réel. –

1

Oui, il n'y a généralement qu'une seule action par test. Invoquer un getter peut être considéré comme n'étant pas une action et donc appartenant à la partie Assert du test.

Dans le test TheCountOfAllRecordsIsGreaterThanZero ci-dessus, la création d'un nouvel enregistrement fait partie de la section Arrangement - ou le test est mal nommé et peut être TheCountOfAllRecordsIncreasedUponLogAction.

Je voudrais également souligner qu'une action par cas de test peut signifier plusieurs lignes de code. L'idée n'est pas d'écrire un scénario entier avec une longue séquence d'actions.

+0

Bon point. Quand j'y pense, je suis en train d '«arranger» certaines données. Ainsi, la création d'un nouvel enregistrement appartient à la section Arrangement. J'ai appris à utiliser la section Arrangement pour des situations autres que le simple ajout d'un seul objet, mais vous avez raison; le but ici est d'être aussi mince que possible avec chaque test. –