Я использую Moq для поблочного тестирования, и я хотел бы протестировать на атрибут представления. В этом случае Авторизовать атрибут.
Код представления в качестве примера:
[Authorize(Roles = "UserAdmin")]
public virtual ActionResult AddUser()
{
// view logic here
return View();
}
Таким образом, я хотел бы протестировать атрибут представления, когда я действую на это представление с пользователем, который находится в роли UserAdmin и пользователя, который не находится в роли пользовательского администратора. Там должен так или иначе сделать это?
Тест в качестве примера:
[Test]
public void Index_IsInRole_Customer()
{
// Arrange
UserAdminController controller = _controller;
rolesService.Setup(r => r.IsUserInRole(It.IsAny<string>(), It.IsAny<string>())).Returns(false); // return false for any role
// Act
var result = controller.AddUser();
// Assert
Assert.IsNotNull(result, "Result is null");
}
Атрибуты - это просто метаданные типа, поэтому они ничего не делают, если окружающая инфраструктура не заставляет их что-то делать (или еще лучше: окружающие инфраструктура что-то делает на основе информации в этих атрибутах). Это то, что делает платформа ASP.NET MVC, когда выполняет запрос.
Это не то, что вы делаете, когда создаете и вызываете действие контроллера в модульном тесте, поэтому, если вы не хотите слишком долго вызывать действие контроллера с помощью ControllerActionInvoker (в этот момент тест перестает быть модулем test и становится интеграционным тестом) вы не можете напрямую протестировать поведение , подразумеваемое атрибутом.
Однако вы можете написать модульный тест, который проверяет, правильно ли атрибут украшает действие контроллера:
var attributes = typeof(UserAdminController)
.GetMethod("AddUser").GetCustomAttributes(true);
var result = attributes.OfType<AuthorizeAttribute>().Single();
Assert.AreEqual("UserAdmin", result.Roles);
При выполнении приведенного выше теста атрибут AuthorizeAttribute не будет принят во внимание (то есть, никто не будет его оценивать). Обычно за это отвечает ControllerActionInvoker (класс в System.Web.Mvc).
Возможно, вы захотите просто поверить, что AuthorizeAttribute реализован правильно. Затем просто используйте отражение, чтобы проверить, что атрибут AuthorizeAttribute был правильно определен для вашего действия.