代码之家  ›  专栏  ›  技术社区  ›  LiamB

ASP.NET-MVC和MOQ

  •  2
  • LiamB  · 技术社区  · 15 年前

    我开始为我们的项目建立单元测试。我们已经决定使用moq来帮助“模拟”存储库,因为我们不想对live db运行测试。

    很明显我没有正确使用moq,如何编写getMessage测试?前两个似乎工作得很好。

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

    编辑==================================

    下面呢?

    [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);
            }
    
    2 回复  |  直到 15 年前
        1
  •  1
  •   Mark Seemann    15 年前

    最好设置存根,以便验证是否将正确的消息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);
    }
    

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

        2
  •  2
  •   Daniel Elliott    15 年前

    你需要为你的嘲笑设定一个期望值。类似于:

        [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。服务使用的方法需要模拟。

    这将是所有使用这个模拟。因此,我将在单独的测试中设置它,而不是初始化它。我只是想强调你需要一个期待。

    仁慈,