Как unit test использовать метод контроллера с атрибутом [Авторизовать]?
Я обыскал stackoverflow и googled четыре через пару часов и до сих пор не нашел решения для моей "тривиальной" проблемы.
Если вы пишете unit test для вашего отфильтрованного [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.