2009-10-19 5 views
6

J'essaie d'adopter le TDD et j'ai commencé à apprendre sur le moqueur. J'ai besoin de conseils sur ce que je devrais tester et sur la façon de rendre mes cours plus comportementaux et non de simples conteneurs de données (avec un groupe de getters/setters).Je passe de la vérification d'état à la vérification comportementale à l'aide de MOQ

Envisagez cette classe.

public class Post 
{ 
    List<Comment> Comments {get; private set;} 

    public void AddComment(string message) 
    { 
     Comment.Add(new Comment(message)); 
    } 
} 

Un exemple d'un test de vérification de l'Etat serait

[Test] 
public void CanAddCommentToPost() 
{ 
    Post p = new Post(); 
    p.AddComment("AAAAA"); 
    Assert.AreEqual(1, Comments.Count); 
} 

I », pas exactement ce que je devrais faire pour la vérification du comportement, quelqu'un peut-il fournir des échantillons à l'aide Moq?

+0

Avez-vous déjà trouvé une solution à cette question? Je suis assez curieux de savoir comment cela se passe pour vous. –

Répondre

5

Vous devrez redessiner votre classe Post un peu, mais pas de soucis. Cette légère reconception vous permettra d'utiliser Moq pour vérifier le comportement que vous attendez. Je vais aussi vous montrer un moyen un peu mieux de nommer vos tests afin que l'on sache clairement ce qu'ils essaient de tester.

[Test] 
public void AddComment_NonNullMessage_IsAddedToCollection 
{ 
    string message = "Test message"; 

    //Setup expectations 
    Mock<IList<Comment>> commentsMock = new Mock<IList<Comment>>(); 
    commentsMock.Setup(list => list.Add(new Comment(message))); 

    //Create target, passing in mock list 
    Post target = new Post(commentsMock.Object); 
    target.AddComment(message); 

    //Verify our expectations are met 
    commentsMock.VerifyAll(); 
} 

Et c'est tout. Le Mock lancera automatiquement une exception si toutes les attentes ne sont pas satisfaites correctement.

Espérons que cela aide.

-Anderson

+0

+1. Voir aussi [Démarrage moq] (http://code.google.com/p/moq/wiki/QuickStart) sous Vérification. – TrueWill

+0

Votre exemple ne fonctionne pas hors de la boîte. La configuration d'installation n'est pas mise en correspondance car le commentaire transmis dans l'installation n'est pas égal au commentaire ajouté dans la méthode Post.AddComment. J'ai changé la configuration à list.Add (It.IsAny ()), mon raisonnement étant que je ne m'inquiète pas du message qu'il contient mais je vérifie juste que l'add est appelé. – brumScouse

0

Je ne me souviens pas de la syntaxe moq à la main mais je le vois comme ça.

Faire des commentaires sur une interface de IComments et d'affirmer que cet ajout est appelé sur l'interface.

+0

C'est à peu près l'approche que j'ai prise dans ma réponse, mais je suis allé avec un standard IList , plutôt qu'une nouvelle IComments d'interface. –

Questions connexes