Есть ли способ для свойств 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