Модульный тест для атрибута просмотра с использованием Moq - PullRequest
5 голосов
/ 19 февраля 2010

Я использую Moq для модульного тестирования, и я хотел бы проверить атрибут представления. В этом случае атрибут Authorize.

Пример просмотра кода:

[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");
}

Ответы [ 2 ]

9 голосов
/ 19 февраля 2010

Атрибуты - это просто метаданные типа, поэтому они ничего не делают, если окружающая инфраструктура не заставляет их что-то делать (или еще лучше: окружающая инфраструктура делает что-то на основе информации в этих атрибутах). Это то, что ASP.NET MVC делает, когда выполняет запрос.

Это не то, что вы делаете, когда вы создаете и вызываете действие контроллера в модульном тесте, поэтому, если вы не хотите идти на все, чтобы вызвать действие контроллера с помощью ControllerActionInvoker (в этот момент тест перестает быть единичным и становится интеграционным тестом) вы не можете напрямую протестировать поведение , подразумеваемое атрибутом.

Однако вы можете написать модульный тест, который проверяет, правильно ли атрибут украшает действие контроллера:

var attributes = typeof(UserAdminController)
    .GetMethod("AddUser").GetCustomAttributes(true);
var result = attributes.OfType<AuthorizeAttribute>().Single();
Assert.AreEqual("UserAdmin", result.Roles);
0 голосов
/ 19 февраля 2010

При выполнении указанного выше теста AuthorizeAttribute не будет учитываться (то есть никто не будет его оценивать).Обычно это ответственность ControllerActionInvoker (класс в System.Web.Mvc).

Возможно, вы захотите просто поверить, что AuthorizeAttribute правильно реализован.Затем просто используйте отражение, чтобы убедиться, что AuthorizeAttribute был правильно определен в вашем действии.

...