2009-10-19 8 views
6

Ich versuche, TDD zu umarmen und fing an, über Spott zu lernen. Ich brauche einen Ratschlag, was ich testen sollte und wie ich meine Klassen verhaltensmäßiger gestalten kann und nicht einfache Datencontainer (mit einer Menge Getter/Setter).Von Zustandsüberprüfung zu Verhaltensüberprüfung mit MOQ gehen

Betrachten Sie diese Klasse.

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

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

Ein Beispiel eines Verifikations Prüfzustand

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

ich, nicht ganz sicher wäre, was ich für Verhaltens Überprüfung tun sollten, Moq verwenden einige Proben jemand zur Verfügung stellen kann?

+0

Haben Sie jemals eine Lösung für diese Frage gefunden? Ich bin ziemlich gespannt, wie es dir geht. –

Antwort

5

Sie müssten Ihre Post-Klasse ein wenig umgestalten, aber keine Sorge.

Dieses leichte Redesign gibt Ihnen die Möglichkeit, Moq zu verwenden, um das von Ihnen erwartete Verhalten zu überprüfen. Ich werde Ihnen auch einen etwas besseren Weg zeigen, Ihre Tests so zu benennen, dass klar ist, was sie zu testen versuchen.

[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(); 
} 

Und das ist alles. Der Mock wird automatisch eine Ausnahme auslösen, wenn alle Erwartungen nicht korrekt erfüllt werden.

Hoffe, das hilft.

-Anderson

+0

+1. Siehe auch [moq Quickstart] (http://code.google.com/p/moq/wiki/QuickStart) unter Verifizierung. – TrueWill

+0

Ihr Beispiel funktioniert nicht out-of-the-box. Das Setup-Gerät stimmt nicht überein, da der im Setup übergebene Kommentar nicht dem in der Post.AddComment-Methode neu erstellten Kommentar entspricht. Ich änderte das Setup zu list.Add (It.IsAny ()), meine Begründung ist, dass ich nicht über die Nachricht, die es enthält, aber eher ich bin nur überprüfen, dass Hinzufügen aufgerufen wird. – brumScouse

0

Ich kann mich nicht erinnern, die Moq-Syntax zu übergeben, aber ich sehe es so.

Machen Sie Kommentare zu einer Schnittstelle von IComments und bestätigen Sie, dass Add auf der Schnittstelle aufgerufen wird.

+0

Dies ist so ziemlich der Ansatz, den ich in meiner Antwort nahm, aber ich ging mit einem Standard-IList , anstatt eine neue Schnittstelle IComments. –