ASP.Net - MVC и Moq - PullRequest
       29

ASP.Net - MVC и Moq

2 голосов
/ 16 декабря 2009

Я начинаю создавать модульные тесты для нашего проекта. Мы решили, что 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);
        }

РЕДАКТИРОВАТЬ = == ===============================

А как насчет следующего?

[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 ]

2 голосов
/ 16 декабря 2009

Вы должны установить ожидание для вас издеваться. Что-то вроде:

    [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, который использует Сервис. Это метод, который используется службой, который необходимо смоделировать.

Это будет сделано для всех применений этого макета. По этой причине я бы настроил его в отдельном тесте, а не инициализировал. Я просто хотел подчеркнуть, что вам нужно ожидание.

Доброжелательность,

Dan

1 голос
/ 16 декабря 2009

Может быть лучше настроить заглушку так, чтобы вы проверяли, что правильный метод сообщения передается методу хранилища:

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

Обратите внимание, что я также изменил утверждение, чтобы оно проверяло то, о чем вы, вероятно, будете заботиться: что возвращаемое значение является правильным (а не только нулевым или нет).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...