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

时间:2010-02-19 14:23:20

标签: asp.net asp.net-mvc unit-testing moq

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

示例查看代码:

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

因此,当我使用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");
}

2 个答案:

答案 0 :(得分:9)

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

在单元测试中创建和调用Controller Action时,这不是你所做的,所以除非你想花很多时间使用ControllerActionInvoker来调用Controller Action(此时测试不再是一个单元)测试并成为集成测试)您无法直接测试属性隐含的行为

但是,您可以编写一个单元测试来验证属性是否正确地修饰了控制器操作:

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

答案 1 :(得分:0)

执行上面的测试时,不会考虑AuthorizeAttribute(也就是说,没有人会对其进行评估)。这通常是ControllerActionInvoker(System.Web.Mvc中的一个类)的责任。

您可能只想信任AuthorizeAttribute已正确实现。然后只需使用反射来验证是否已在您的操作上正确定义了AuthorizeAttribute。