【问题标题】:Unit Test for a View Attribute using Moq使用 Moq 对视图属性进行单元测试
【发布时间】:2011-01-18 19:25:51
【问题描述】:

我正在使用最小起订量进行单元测试,我想测试视图的属性。 在本例中为 Authorize 属性。

示例查看代码:

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

因此,当我使用具有 UserAdmin 角色的用户和不具有用户 admin 角色的用户对该视图执行操作时,我想测试视图属性。有没有办法做到这一点?

示例测试:

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

【问题讨论】:

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


    【解决方案1】:

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

    这不是你在单元测试中创建和调用控制器动作时所做的,所以除非你想竭尽全力使用 ControllerActionInvoker 调用控制器动作(此时测试不再是一个单元测试并成为集成测试)您不能直接测试该属性所隐含的行为

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

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

    【讨论】:

    • 是的,也许我的问题应该是,应该我测试动作属性。但很好的答案谢谢老兄! +1
    • 我还有一个问题......如果我有两个同名的操作,一个是 GET,一个是 Post....当我使用 GetMethod 时,我收到一个模棱两可的错误成立。如何区分?
    • @gmcalab:那么您将需要使用GetMethod(string, Type[]) 重载。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2011-12-24
      • 2012-06-01
      • 2021-10-15
      • 2011-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多