Going From State Verification to Behavioral Verification using MOQ

mocking, moq

Solution

You'd have to redesign your Post class a bit, but no worries.

public class Post
{
     private IList<Comment> _comments;
     public Post(IList<Comment> commentContainer)
     {
          _comments = commentContainer;
     }

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

This slight redesign will give you the ability to use Moq to verify the behavior your are expecting. I'll also show you a slightly better way to name your tests so that it's clear what they are trying to test.

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

And that is all. The Mock will automatically throw an exception if all expectations are not met correctly.

Hope this helps.

-Anderson

Problem

I am trying to embrace TDD and started learning about mocking. I need some advice on what i should test and how to make my classes more behavioral and not simple data containers (with a bunch of getters/setters). Consider this class. ``` public class Post { List<Comment> Comments {get; private set;} public void AddComment(string message) { Comment.Add(new Comment(message)); } } ``` An example of a state verification test would be ``` [Test] public void CanAddCommentToPost() { Post p = new Post(); p.AddComment("AAAAA"); Assert.AreEqual(1, Comments.Count); } ``` I', not exactly sure what i should be doing for behavioural verification, can someone provide some samples using Moq?

Original source