Я играю, чтобы узнать, как тестировать действия контроллера ASP.NET MVC.В частности, я пытаюсь смоделировать ControllerContext, чтобы я мог проверить действие, которое обращается к HttpContext.Current.User.Identity.Name.
Я использую Moq.
Все шло довольнохорошо, пока я не включил MockBehavior.Strict.Я знал, что это вызовет исключение, если код не сможет вызвать то, что я отметил Verifiable.По-видимому, он также выдаст исключение, если «дополнительные» методы, в которых я не предоставляю настройки (например, IsChildAction), не будут вызваны.
[TestMethod]
public void Index_Get_AccessesUserIdentityName()
{
// Arrange
var mock = new Mock<ControllerContext>(MockBehavior.Strict);
mock.SetupGet(p => p.HttpContext.User.Identity.Name).Returns("treycarroll").Verifiable();
HomeController controller = new HomeController();
controller.ControllerContext = mock.Object;
// Act
ViewResult result = controller.Index() as ViewResult;
// Assert
mock.Verify();
...
}
Вот действие Controller, которое я тестирую:
public ActionResult Index()
{
ViewData["Message"] = "Welcome to ASP.NET MVC!"+User.Identity.Name;
return View();
}
Исключение срабатывает при возврате View ();заявление выполнено.Сообщение об ошибке говорит мне, что мне нужен метод установки для вызова IsChildAction, поэтому я обновил свой тестовый класс следующим образом:
[TestMethod]
public void Index_Get_AccessesUserIdentityName()
{
// Arrange
var mock = new Mock<ControllerContext>(MockBehavior.Strict);
string expectedUserName = "treycarroll";
mock.SetupGet(p => p.HttpContext.User.Identity.Name).Returns(expectedUserName).Verifiable();
mock.SetupGet(m => m.IsChildAction).Returns(true).Verifiable();
HomeController controller = new HomeController();
controller.ControllerContext = mock.Object;
// Act
ViewResult result = controller.Index() as ViewResult;
string actualUserName = controller.ControllerContext.HttpContext.User.Identity.Name;
// Assert
mock.Verify();
Assert.AreEqual(actualUserName, expectedUserName);
Assert.IsNotNull(result);
}
...
После чего я получаю похожую ошибкуоб отсутствии метода настройки для ControllerContext.RouteData.В процессе устранения я мог бы добавить методы установки для всех пропущенных вызовов, но это кажется неправильным.Может быть, я неправильно понимаю использование MockBehavior.Strict, но я подумал, что вы включите его, чтобы избежать получения значений по умолчанию для ваших свойств (например, null для объекта User, который я хочу проверить).Что мне здесь не хватает?