Есть ли способ для свойств unit test ASP.NET MVC ViewBag, заданных в представлении?

Скажем, у меня есть вид со следующим кодом в верхней части страницы:

@{
    ViewBag.Title = "About Us";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

И у меня есть метод контроллера:

    public ActionResult About()
    {
        return View();
    }

Как проверить, правильно ли установлен ViewBag?

Я пробовал следующий код.

[TestCase]
public void About()
{
    var controller = new AboutController();
    var ar = controller.About() as ViewResult;
    Assert.AreEqual("About Us", ar.ViewBag.Title);
}

Но при выполнении теста я получаю следующий результат:

Tests.Controllers.AboutControllerTests.About():
    Expected: "About Us"
    But was: null

Ответы

Ответ 1

Нет, вы не можете тестировать такие виды. Самое близкое, что вы можете получить, - это визуализировать представление в потоковом потоке, а затем протестировать сгенерированный HTML. Это не то, что обычно делается в модульных тестах. Я бы порекомендовал вам выполнять веб-тесты, чтобы проверить правильность представлений. Вы можете создать веб-тесты с помощью Visual Studio, а также бесплатный Selenium.

Ответ 2

Поскольку и ViewData, и ViewBag используют один и тот же шаблон хранилища, вы должны иметь возможность использовать ViewData[yourKey] в своих тестах.

Итак, ваш тест будет выглядеть следующим образом:

[TestCase]
public void About()
{
    var controller = new AboutController();
    var ar = controller.About() as ViewResult;
    Assert.AreEqual("About Us", ar.ViewData["Title"]);
}

Ответ 3

Вы пробовали

Assert.AreEqual("About Us", controller.ViewBag.Title);

Это работает для меня

Ответ 4

ViewResult, возвращаемый контроллером, имеет только ссылку на представление, которое должно быть показано. В настоящее время представление не разрешено. Код, который никогда не выполнялся вашим тестом.

То, что вам нужно сделать, это установить свойства ViewBag в контроллере, а не на просмотр. Обычно представление будет читать только такие значения.

надеюсь, что это поможет

Ответ 5

В чем его ценность, я обнаружил, что следующее работает нормально:

Assert.AreEqual(_layout, result.ViewBag.Layout);

Если result является ViewResult