Как выполнить модульное тестирование метода контроллера, к которому применен атрибут [Authorize]?

Я искал stackru и гуглил четыре пару часов и до сих пор не нашел решения для моей "тривиальной" проблемы.

Если вы пишете модульный тест для вашего фильтрованного [Authorize] ActionResultКак вы решаете проблему, чтобы подделать, что пользователь аутентифицирован?

у меня много ActionResult методы, которые фильтруются с [Authorize] и я хочу проверить все мои ActionResult методы независимо от того, если они отфильтрованы с [Authorize] или нет.

Простой пример того, что я имею в виду:

[TestMethod]
public void Create_Get_ReturnsView()
{
 // Arrange
 var controller = new UserController();
 // Act
 var result = controller.Create();
 // Assert
 Assert.IsNotNull(result as ViewResult);
}

[Authorize]
public ActionResult Create()
{
 return View("Create");
}

На данный момент тесты даже не затрагивают метод ActionResult из-за фильтра [Authorize], исключение: System.NullReferenceException: Object reference not set to an instance of an object.

1 ответ

Решение

Вам нужно смоделировать контекст для вашего контроллера. Попробуйте использовать Moq

Ваша организация будет выглядеть так:

var controller = new UserController();
var mock = new Mock<ControllerContext>();
mock.SetupGet(x => x.HttpContext.User.Identity.Name).Returns("SOMEUSER");
mock.SetupGet(x => x.HttpContext.Request.IsAuthenticated).Returns(true);
controller.ControllerContext = mock.Object;

После этого вы сможете выполнить свой Акт и Утвердить.

Если вы еще этого не сделали, я бы настоятельно рекомендовал просмотреть NerdDinner в качестве примера сайта MVC.

Другие вопросы по тегам