Модульный тест на использование Атрибута Представления Moq

Я использую 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");
}
5
задан DaveRandom 25 February 2013 в 21:12
поделиться

2 ответа

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

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

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

var attributes = typeof(UserAdminController)
    .GetMethod("AddUser").GetCustomAttributes(true);
var result = attributes.OfType<AuthorizeAttribute>().Single();
Assert.AreEqual("UserAdmin", result.Roles);
9
ответ дан 14 December 2019 в 01:07
поделиться

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

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

0
ответ дан 14 December 2019 в 01:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: