我正在使用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");
}
答案 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。