2009-10-19 9 views
6

Estoy tratando de abrazar TDD y comencé a aprender acerca de la burla. Necesito algunos consejos sobre lo que debería probar y cómo hacer que mis clases sean más conductuales y no simples contenedores de datos (con un montón de getters/setters).Pasar de la verificación del estado a la verificación del comportamiento usando MOQ

Considere esta clase.

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

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

Un ejemplo de una prueba de verificación del estado sería

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

I', no exactamente seguro de lo que debería estar haciendo para la verificación de comportamiento, alguien puede proporcionar algunas muestras usando Moq?

+0

¿Alguna vez resolvió esta pregunta? Tengo mucha curiosidad de cómo te está yendo esto. –

Respuesta

5

Tendría que rediseñar un poco su clase de publicación, pero no se preocupe.

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

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

Este ligero rediseño le dará la posibilidad de utilizar Moq para verificar el comportamiento de su espera. También le mostraré una forma ligeramente mejor de nombrar sus pruebas para que quede claro lo que están tratando de probar.

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

Y eso es todo. El simulacro arrojará automáticamente una excepción si todas las expectativas no se cumplen correctamente.

Espero que esto ayude.

-Anderson

+0

+1. Consulte también [inicio rápido de moq] (http://code.google.com/p/moq/wiki/QuickStart) en Verificación. – TrueWill

+0

Su ejemplo no funciona de la caja. El accesorio de configuración no coincide cuando el comentario pasado en la configuración no es igual al comentario creado en el método Post.AddComment. Cambié la configuración a list.Add (It.IsAny ()), mi razón de ser es que no me importa el mensaje que contiene, sino que simplemente estoy verificando que se llama add. – brumScouse

0

No recuerdo la sintaxis de moq a mano, pero lo veo así.

Hacer comentarios una interfaz de IComments y afirmar que se llama a Add en la interfaz.

+0

Este es más o menos el enfoque que tomé en mi respuesta, pero fui con un IList estándar , en lugar de una nueva interfaz IComments. –

Cuestiones relacionadas