MVC MSpec测试没有达到[Authorize]属性

时间:2012-01-31 10:26:21

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

我有一个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()结果。

1 个答案:

答案 0 :(得分:3)

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

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

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