【问题标题】:MVC MSpec test not hitting [Authorize] attributeMVC MSpec 测试未命中 [Authorize] 属性
【发布时间】:2012-01-31 10:26:21
【问题描述】:

我有一个 MSpec 测试来检查我的表单身份验证是否正确重定向了未经授权的请求,但是对受保护操作的测试调用直接进入它而不会被授权捕获。 根据我的阅读,人们通常需要伪造身份验证来测试带有 [Authorize] 标签的操作,所以我不明白它是如何直接进入受保护的操作方法的。

如果有人能提供帮助将不胜感激,这是我第一次尝试使用 MSpec,它看起来应该非常有用,但我无法让它工作!

控制器:

[Authorize]
public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View("Index", null);
    }
}

测试:

[Subject("Login and Authentication")]
public class when_protected_page_invoked
{
    private static HomeController homeController;
    private static SecurityController securityController;
    private static ActionResult result;

    private Establish context = () =>
    {
        homeController = new HomeController();
        securityController = new SecurityController(new SecurityService(new NHibernateRepository<User>(), new NHibernateRepository<Session>()));
    };

    private Because of = () => result = homeController.Index();

    private It should_redirect_to_securityController = () =>
        {
            result.ShouldBeARedirectToRoute().And().ControllerName().ShouldEqual("Security");
        };
}

当我现在运行测试时,它会失败并返回一个 ViewResult 异常,如果我调试它只是返回 Home.Index() 结果。

【问题讨论】:

  • 如果调试索引操作,User.Identity.IsAuthenticated 返回什么?也许 MSpec 在后台将其设置为 true
  • this question 关于同样的问题,但 NUnit 建议 Authorize 在路由级别启动,因此无法通过直接调用控制器来实现。这确实是有道理的,但不同意我看到的那些说你需要伪造身份验证的说法。

标签: c# asp.net-mvc-3 forms-authentication mspec


【解决方案1】:

这很正常。在这种情况下不执行操作过滤器。您所做的就是在单元测试中调用 action 方法。对此进行单元测试的正确方法是验证该控制器是否使用 Authorize 属性进行修饰:

Assert.IsTrue(typeof(HomeController).GetCustomAttributes(typeof(AuthorizeAttribute), true).Any());

如果用户未通过身份验证,控制器使用 Authorize 属性装饰将重定向到正确的登录页面这一事实不应该进行单元测试。这是 ASP.NET MVC 框架的一部分,微软(希望)已经对其进行了广泛的单元测试。

【讨论】:

  • 动作过滤器是唯一不执行的属性吗? [Inject] 属性(来自 Ninject)是否会作为 MSpec 测试的一部分运行?
猜你喜欢
  • 2011-06-07
  • 1970-01-01
  • 2010-10-07
  • 1970-01-01
  • 1970-01-01
  • 2010-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多