Как смоделировать контекст контроллера с помощью moq - PullRequest
6 голосов
/ 30 июля 2009

Я опробую среду MOQ, и теперь я столкнулся с барьером. Следующий модульный тест не пройден, поскольку фактическим значением свойства ViewName является пустая строка.

Может ли кто-нибудь указать мне правильное направление, пожалуйста, почему это не проходит тест?

[TestMethod]
public void Can_Navigate_To_About_Page()
{
    var request = new Mock<HttpRequestBase>();
    request.Setup(r => r.HttpMethod).Returns("GET");
    var mockHttpContext = new Mock<HttpContextBase>();
    mockHttpContext.Setup(c => c.Request).Returns(request.Object);

    var controllerContext = new ControllerContext(mockHttpContext.Object, 
                                new RouteData(), 
                                new Mock<ControllerBase>().Object);
    var controller = new HomeController();

    controller.ControllerContext = controllerContext;
    var result = controller.About() as ViewResult;

    Assert.AreEqual("About", result.ViewName);
}

Следующее также приводит к пустому ViewName.

        HomeController controller = new HomeController();
        ViewResult result = controller.About() as ViewResult;
        Assert.IsNotNull(result);
        Assert.AreEqual("About", result.ViewName);

Из примеров в Интернете, которые демонстрируют насмешливость, а также хорошее TTD, я просто запутался в отношении того, какую другую сантехнику мне нужно, чтобы любой из приведенных выше примеров первого модульного теста работал.

Приветствия

Andrew

Ответы [ 2 ]

7 голосов
/ 30 июля 2009

Причина, по которой тест не пройден, заключается в том, что решение ViewName, если вы не указали его явно, находится в недрах платформы. Точнее в вид двигателя я верю. Таким образом, чтобы проверить это в его нынешнем виде, вам придется смоделировать намного больше конвейера запросов.

Что я делаю и рекомендую, так это не полагаться на значения по умолчанию и явно указывать представление:

return View("About");

Тогда будет проверено значение, не издеваясь над чем-либо:

var controller = new HomeController();
var result = controller.About() as ViewResult;
Assert.AreEqual("About", result.ViewName);
3 голосов
/ 30 июля 2009

Это потому, что вы делаете предположения о том, как работает инфраструктура MVC. Если вы полагаетесь на соглашения для определения местоположения представления, платформа фактически оставляет свойство ViewName как String.Empty, пока не будет вызван ExecuteResult().

Вы можете увидеть этот код в строке 68 ViewResultBase.ExecuteResult в источнике MVC :

if (String.IsNullOrEmpty(ViewName)) {
   ViewName = context.RouteData.GetRequiredString("action");
}

Кроме того, вы должны быть осторожны с тем, что тестируете. Как правило, вы должны сосредоточиться на тестировании кода, который вы пишете , а не кода фреймворка. Проверка правильности разрешения имени представления по сути является модульным тестом для самой платформы, а не для приложения, построенного на ней.

Если вы ищете хороший способ использовать моделирование в MVC, вы можете посмотреть на тестирование ваших маршрутов (что-то вроде того, что вы пытаетесь сделать здесь). Вы можете найти сообщение Фила Хаака, касающееся именно этой темы , чтобы начать работу.

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