Модульное тестирование Html.Action и PartialView - PullRequest
0 голосов
/ 04 августа 2011

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

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 ]

2 голосов
/ 04 августа 2011
  1. ViewResult и, в более общем смысле, ActionResult - это некая спецификация того, что выполнять при возврате результатов клиенту. Другими словами, создание его экземпляра (возвращение View () из контроллера) создает спецификацию, но не выполняет ее. Среда выполнения MVC фиксирует, что ActionResult вернул контроллер и Execute()s его. Вы не можете разбить внутри представления, потому что оно еще не выполнено - спецификация только что создана. Если бы вы вызвали метод Execute() для него, как это делает среда выполнения mvc, вы бы запустили выполнение представления и нажали на отладчик.
  2. Вы не можете видеть имя представления, потому что вы не установили его. От MSDN

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

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

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

2 голосов
/ 04 августа 2011

Когда вы запускаете свой модульный тест, представление не отображается.@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 будет = "some other non-convetional view" Вы не проверяете имя представления для тех, кто использует соглашения по умолчанию, потому что вы доверяете платформе для правильного подключения.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...