2009-11-18 3 views
0

В моих модульных тестах я обнаружил, что когда я возвращаюсь из действия контроллера, используя View() без имени вида, ViewResult.ViewName имеет значение string.Empty. Чтобы это было задано, оно должно быть указано как параметр для вызова View(). Например, учитывая следующее испытание блока:Почему не указывать имя представления, чтобы мой модульный тест завершился с ошибкой?

[TextFixture] 
public class MyControllerTests 
{ 
    [Test] 
    public void TestMyAction() 
    { 
     var controller = new MyController(); 
     var result = controller.MyAction(); 

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

Следующая реализация действий приведет тест к сбою:

public class MyController : Controller 
{ 
    public ActionResult MyAction() 
    { 
     return View(); 
    } 
} 

в то время как этот один будет проходить:

public class MyController : Controller 
{ 
    public ActionResult MyAction() 
    { 
     return View("MyAction"); 
    } 
} 

Я m с использованием ASP.NET MVC 2 (pre-beta) на .NET 4.0. Однако я не использую ничего особенного .NET 4.0. Я считаю это поведение странным, потому что я думал, что ViewName является одним из надежных свойств, которые могут быть проверены в утверждениях модульных тестов.

ответ

3

Это хорошо известная «функция» ASP.NET MVC. Microsoft зарегистрировала его с первой версии ...

Если явное имя вида не указано, среда пытается найти ее на основе условностей (в «Представлениях \ имя_контроллера \ имя_пользователя» или «Shared \ controllername \ actionname»,). ViewName имеет значение только в том случае, если вы хотите отклониться от этого соглашения. Таким образом, ваш модульный тест делает ложные предположения.

HTH.

+0

я вижу. Существует ли рекомендованная статья/сообщение/что-либо из соответствующих утверждений? – alastairs

+0

Ни одного. Если вы Google для чего-то вроде «asp.net mvc unit testing», вы получаете сотни статей/сообщений в блогах, которые занимаются этой проблемой. Все зависит от того, что именно вы хотите проверить. –