ASP.Net - MVC和Moq

时间:2009-12-16 15:25:56

标签: asp.net asp.net-mvc moq

我开始为我们的项目建立单元测试。我们决定让Moq协助对存储库进行“模拟”,因为我们不想对实时数据库运行测试。

我显然错误地使用Moq,如何编写GetMessage测试?前两个似乎工作正常。

GetMessage测试的返回值始终为null,因此测试失败

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 个答案:

答案 0 :(得分: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。这是服务使用的方法需要被模拟。

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

善,

答案 1 :(得分:1)

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

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