使用Moq对视图属性进行单元测试

Gab*_*abe 5 asp.net asp.net-mvc unit-testing moq

我正在使用Moq进行单元测试,我想测试一个视图的属性.在这种情况下,授权属性.

示例查看代码:

[Authorize(Roles = "UserAdmin")]
public virtual ActionResult AddUser()
{
   // view logic here  
   return View();
}
Run Code Online (Sandbox Code Playgroud)

因此,当我使用UserAdmin角色的用户和不属于用户admin角色的用户对此视图执行操作时,我想测试view属性.反正有没有这样做?

示例测试:

[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");
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*ann 9

属性只是类型的元数据,因此它们不会做任何事情,除非周围的基础设施使它们做某事(或者更好的是:周围的基础设施根据这些属性中的信息做某事).这就是ASP.NET MVC框架在执行请求时所执行的操作.

这不是您在单元测试中创建和调用Controller Action时所执行的操作,因此除非您想要使用ControllerActionInvoker来调用Controller Action(此时测试不再是单元测试并且变为集成测试)您无法直接测试属性隐含的行为.

但是,您可以编写一个单元测试来验证属性是否正确地修饰了Controller Action:

var attributes = typeof(UserAdminController)
    .GetMethod("AddUser").GetCustomAttributes(true);
var result = attributes.OfType<AuthorizeAttribute>().Single();
Assert.AreEqual("UserAdmin", result.Roles);
Run Code Online (Sandbox Code Playgroud)