2009-12-16 50 views
2

我开始为我们的项目建立单元测试。我们决定让Moq协助我们对存储库的“嘲弄”,因为我们不想针对实时数据库运行测试。ASP.Net - MVC和Moq

我很明显使用Moq不正确,如何编写GetMessage测试?前2个似乎工作正常。

所述的GetMessage测试的返回值是空百达所以测试失败

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 = == ===================== ==========

以下情况如何?

[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

您目前的GetMessage测试问题是什么?它是否会抛出异常? – 2009-12-16 15:29:46

+0

我已更新该帖子。返回值为空,因此测试失败 – LiamB 2009-12-16 15:30:14

+0

但您期望什么呢? GetMessaage方法是否查询存储库? IMessageRepository接口是什么样的? – 2009-12-16 15:37:10

回答

1

,让你验证正确的消息ID被传递到存储库的方法可能会更好设置存根:

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

请注意,我也修改了断言,以便验证您可能关心的内容:返回的值是否正确(而不仅仅是否为空)。

+0

感谢您的回复。只需要指出正确的方向 – LiamB 2009-12-16 15:55:41

2

你需要为你设置一个期望模拟。例如:

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

我假定您的存储库具有服务使用的GetMessage。这是需要嘲笑的服务使用的方法。

这将完成这个模拟的所有用途。出于这个原因,我会在单个测试中设置它,而不是初始化。我只是想强调你需要一个期望。

善良,

+0

感谢Daniel,8000只是一个随机ID,因为它附加到没有数据库。你能解释一下你在这里做了什么吗? – LiamB 2009-12-16 15:33:51

+0

Expect方法已过时,不应使用。 – 2009-12-16 15:34:23

+0

这个答案的另一个问题是,它在Initialize方法中设置了模拟,它在所有测试中硬编码模拟返回8000。 – 2009-12-16 15:35:41