2011-08-04 3 views
0

Я хочу проверить некоторые действия контроллера, чьи представления содержат Html.Action с PartialViews. Но при их отладке я не получаю точку останова, которая находится в действии, которое я хочу вызвать через представление.
Вот мой код контроллера:Модульное тестирование Html.Action и PartialView

public class SomeController 
{ 
    public ActionResult MyAction() 
    { 
     return View(); 
    } 

    public PartialViewResult SubAction() 
    { 
     return PartialView(); 
    } 
} 

код в представлении MyAction просто:

@{ 
    ViewBag.Title = "MyAction"; 
} 
@Html.Action("SubAction") 

С моим TestMethod Я хотел бы, чтобы проверить, правильно ли ViewName возвращается:

[TestMethod] 
public void MyActionTest() 
{ 
    SomeController controller = new SomeController(); 
    ViewResult result = controller.MyAction() as ViewResult; 
    Assert.IsNotNull(result, "The result is not a view result."); 
    Assert.AreEqual("some expected name", result.ViewName); 
} 

Другая проблема заключается в том, что result.ViewName здесь пуст, и я не знаю, почему это так. Так что это еще один вопрос без ответа. Эта проблема - вот почему я попытался отладить мой модульный тест и понял, что я не могу вломиться в SubAction().

Любые предложения по этому поводу?

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

ответ

2

Когда вы используете свой модульное тестирование, вид не визуализируется. @Html.Action("SubAction") выполняется только при визуализации представления. Когда вы говорите: «Я хочу протестировать некоторые действия контроллера, чьи представления содержат Html.Action с PartialViews», вы на самом деле говорите, что хотите протестировать представления и логику внутри представлений.

Причина, по которой ваш разрыв в SubAction не достигается, заключается в том, что представление MyAction не отображается вообще. Способом тестирования таких сценариев является:

  1. В тесте 1 Проверьте, возвращает ли MyAction ViewResult, чья внутренняя модель представления имеет все правильные значения в своих свойствах.
  2. В модульном тесте 2 Проверьте, возвращается ли SubAction ViewResult, чья внутренняя модель представления имеет все правильные значения в своих свойствах.
  3. ViewName - свойство, которое заполняется только в том случае, если вы вызываете return View("some other non-convetional view"), тогда result.ViewName will = "some other non-convetional view" Вы не проверяете имя представления для тех, кто использует стандартные значения по умолчанию, потому что вы доверяете фреймворку, чтобы подключить его правильно.
2
  1. ViewResult, и в более общем плане, ActionResult является своего рода спецификации, что выполнить при возвращении результатов клиенту. Другими словами, создание экземпляра его (возвращающего View() из контроллера) создает спецификацию, но не выполняет ее. Время выполнения MVC фиксирует, что ActionResult возвращается с контроллера и Execute()s. Вы не можете сломать внутри представления, потому что он еще не выполнен - ​​спецификация только что создана. Если бы вы написали на него метод Execute(), как и во время выполнения mvc, вы должны вызвать выполнение представления и нажать на отладчик.
  2. Вы не можете видеть имя вида, потому что вы его не задали. От msdn

ViewResult.ViewName получает или задает имя представления для визуализации.

И если вы не устанавливаете его при возврате View, он заполняется только тогда, когда ViewResult равен Executed(), см. Объяснение выше.

Вы должны только проверять контроллер и его итерацию с помощью представлений, репозиториев и т. Д., Когда контроллер тестирования устройства. Вам не нужно отлаживать представление при тестировании контроллера. Если вам нужно проверить SubAction, напишите для него отдельный тест. Вы можете использовать MvcContrib.TestHelpers для более простого модульного тестирования ваших контроллеров.

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