MVC MSpec测试未命中[授权]属性

本文关键字:授权 属性 MSpec 测试 MVC | 更新日期: 2023-09-27 18:21:55

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

MVC MSpec测试未命中[授权]属性

这很正常。在这种情况下,不会执行操作筛选器。您所要做的就是在单元测试中调用action方法。对其进行单元测试的正确方法是验证该控制器是否带有Authorize属性:

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

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