2009-12-16 7 views
2

Je commence à construire des tests unitaires pour un projet que nous avons. Nous avons décidé Moq pour aider avec le 'Mocking' des référentiels car nous ne voulons pas exécuter les tests sur la base de données en direct.ASP.Net - MVC et Moq

J'utilise évidemment Moq de manière incorrecte, Comment écrirait-on le test GetMessage? Les 2 premiers semblent fonctionner correctement.

La valeur de retour de l'essai GetMessage est allways null si le test échoue

private Mock<IMessageRepository> _mockRepository; 
     private IMessageBoardService _service; 

     [TestInitialize] 
     public void Initialize() 
     { 
      _mockRepository = new Mock<IMessageRepository>(); 
      _service = new MessageBoardService(_mockRepository.Object); 
     } 

     [TestMethod] 
     public void CreateMessage() 
     { 
      var result = _service.CreateMessage("Test", "Description", 8000, 0); 
      Assert.IsNotNull(result); 
     } 

     [TestMethod] 
     public void CreateComment() 
     { 
      var Message = _service.CreateMessage("Test", "Description", 8000, 0); 
      var Result = _service.CreateComment("Test Comment", Message.MessageID, 0); 
      Assert.IsNotNull(Result); 
     } 

     [TestMethod] 
     public void GetMessage() 
     { 
      var Message = _service.CreateMessage("Test", "Description", 8000, 0); 
      _service.AddMessage(Message); 
      _service.Save(); 

      var RetMessage = _service.GetMessage(Message.MessageID); //Always returns Null 

      Assert.IsNotNull(RetMessage); 
     } 

EDIT = == ===================== ==========

Qu'en est-il de ce qui suit?

[TestMethod] 
     public void GetMessage() 
     { 
      var tmpMessage = _service.CreateMessage("Test", "Description", 5, 0); 
      _mockRepository.Setup(r => r.GetMessage(It.IsAny<int>())) 
        .Returns(tmpMessage); 

      var RetMessage = _service.GetMessage(tmpMessage.MessageID); 

      Assert.IsNotNull(RetMessage); 
     } 
+0

Quel est votre problème actuel avec le test GetMessage? Est-ce qu'il lance une exception? –

+0

J'ai mis à jour le post. La valeur de retour est toujours nulle, donc le test échoue – LiamB

+0

Mais qu'attendez-vous à la place? La méthode GetMessaage interroge-t-elle le référentiel? À quoi ressemble l'interface IMessageRepository? –

Répondre

1

Il pourrait être préférable de configurer la Stub afin de vérifier que l'ID de message correct est passé à la méthode du dépôt:

[TestMethod] 
public void GetMessage() 
{ 
    var tmpMessage = _service.CreateMessage("Test", "Description", 5, 0); 
    _mockRepository.Setup(r => r.GetMessage(tmpMessage.MessageID)) 
     .Returns(tmpMessage); 

    var RetMessage = _service.GetMessage(tmpMessage.MessageID); 

    Assert.AreEqual(tmpMessage, RetMessage); 
} 

Notez que je ont également modifié l'assertion afin qu'elle vérifie ce dont vous vous souciez probablement: que la valeur retournée est correcte (et pas seulement si elle est nulle ou non).

+0

Merci pour la réponse. Juste besoin de pointage dans la bonne direction – LiamB

2

Vous devez définir une attente pour vous factice. Quelque chose comme:

[TestInitialize] 
    public void Initialize() 
    { 
     _mockRepository = new Mock<IMessageRepository>(); 
     _mockRepository.Setup(r=> r.GetMessage()) 
         .Returns(8000); // I assume 8000 is message Id in test 
     _service = new MessageBoardService(_mockRepository.Object); 
    } 

J'ai supposé que votre référentiel a un GetMessage que le service utilise. C'est la méthode que le service utilise qui doit être moquée.

Ceci sera fait pour toutes les utilisations de ce modèle. Pour cette raison, je l'établirais dans le test individuel plutôt que d'initialiser. Je voulais juste souligner que vous avez besoin d'une attente.

Bonté,

Dan

+0

Merci Daniel, 8000 était juste un ID aléatoire, puisqu'il est attaché à aucune base de données. Pouvez-vous expliquer exactement ce que vous avez fait ici? – LiamB

+0

La méthode Expect est obsolète et ne doit pas être utilisée. –

+0

Un autre problème avec cette réponse est qu'il configure le mock dans la méthode Initialize, qui code dur le mock pour renvoyer 8000 dans tous les tests. –