2009-07-30 10 views
6

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

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

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

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

Приветствия,

Эндрю

ответ

7

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

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

return View("About"); 

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

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

Thankyou, после просмотра одного из методов подписи является View (string viewName, object model), ваша точка имеет прекрасный смысл! Постскриптум тест прошел! :-) –

3

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

Вы можете увидеть этот код на линии 68 ViewResultBase.ExecuteResult в the MVC source:

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

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

Если вы ищете хороший способ использования насмешек в MVC, вы можете посмотреть на тестирование своих маршрутов (что похоже на то, что вы пытаетесь сделать здесь). Вы можете find a post by Phil Haack concerning just this subject, чтобы вы начали.

Смежные вопросы