Как проверить представление по умолчанию при использовании T4MVC с MvcContrib.TestHelper AssertViewRendered - PullRequest
3 голосов
/ 16 февраля 2012

Я использую T4MVC в моем проекте ASP.NET MVC 3. У меня есть следующий базовый тест:

[TestMethod]
public void IndexReturnsIndexView()
{
    var controller = new HomeController();
    var result = controller.Index();

    result.AssertViewRendered().ForView(MVC.Home.Views.Index);
}

Тест не пройден, если метод контроллера возвращает значение по умолчанию. Просмотр:

public virtual ActionResult Index()
{
    return View();
}

Ошибка:

MvcContrib.TestHelper.ActionResultAssertionException: Expected view name '~/Views/Home/Index.cshtml', actual was ''

Но тест пройден, если я переопределю View, чтобы указать, какой viewName вернуть:

public virtual ActionResult Index()
{
    return View(MVC.Home.Views.Index);
}

Я пытался использовать следующее утверждение, но все же не повезло:

result.AssertViewRendered().ForView(MVC.Home.Index().GetT4MVCResult().Action);

Возникла следующая ошибка:

MvcContrib.TestHelper.ActionResultAssertionException: Expected view name 'Index', actual was ''

Затем я понял, что неправильно прочитал ошибку подтверждения, поэтому я изменил тест следующим образом:

result.AssertViewRendered().ForView(String.Empty);

Тест пройден, но сам тест кажется бесполезным.

Желательно, чтобы я не хотел указывать все представления по имени, так как мне это проверить? Чтобы уточнить, я использую MvcContrib.Mvc3.TestHelper-ci 3.0.96.0 , который я установил сегодня из NuGet.

UPDATE

Это не ответ на вопрос, но вместо этого я начал делать следующее, что дает большую ценность в качестве контрольного примера:

using (var controller = new FeatureController(mockGateway))
{
    // Act
    var result = controller.Index();
    var model = result.ViewData.Model as MyModel;

    // Assert
    Assert.IsNotNull(model, "Model is null or wrong type");
    result.AssertViewRendered().WithViewData<MyModel>();

    // Alternative Assert for model data
    Assert.IsTrue(model.Items.Count > 0);
}

Ответы [ 2 ]

0 голосов
/ 15 ноября 2013

AssertViewRendered (). ForView () проверяет имя представления, которое вы явно передаете View (), и есть действие вашего контроллера. Если, как вы делаете, вы не указываете имя представления в своем действии, то .ForView () будет проверять пустую строку, как вы видели.

Если вы вызвали View («Индекс»); в своем действии вы можете вызвать .ForView ("Index") в своем тесте.

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

0 голосов
/ 21 января 2013

Я оставил это открытым в течение значительного периода времени, чтобы кто-нибудь еще мог ответить, если они захотят.Теперь я сам отвечу на это.

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

using (var controller = new FeatureController(mockGateway))
{
    // Act
    var result = controller.Index();
    var model = result.ViewData.Model as MyModel;

    // Assert
    Assert.IsNotNull(model, "Model is null or wrong type");
    result.AssertViewRendered().WithViewData<MyModel>();

    // Alternative Assert for model data
    Assert.IsTrue(model.Items.Count > 0);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...