MsTests MVC5 控制器不触发 OnAuthorization

MsTests MVC5 Controller not triggering OnAuthorization

我正在测试当前项目的控制器操作。得到了一种模拟登录用户的方法,这样我就可以控制对数据本身的访问,在我忘记模拟用户的一种方法上,我很惊讶,而不是获得重定向(非匿名操作的定义行为,当你是未记录),操作完美执行。 我调试并发现没有调用 OnAuthorization 方法(我所有的控制器都继承自覆盖它的自定义控制器。

这是有问题的测试:

[TestMethod]
public void GetOffersUserCanImprove()
{
    ContractsController controller = new ContractsController();

    ViewResult result = controller.ReceivingImprovements() as ViewResult;

    Assert.IsNotNull(result, "No se pudo acceder a la página de recibir mejoras.");
}

和自定义控制器(它在 运行 应用程序时完美调用方法,只是在测试时跳过它):

public class MiComunidadController : Controller
{
    protected LoginManager loginManager = LoginManager.EnviromentalFactory();

    protected override void OnAuthorization(AuthorizationContext filterContext)
    {
        base.OnAuthorization(filterContext);

        // Rest of security stuff, non relevant, the execution never
        // reaches this point.
    }
}

关于为什么会发生这种情况以及如何使测试控制器遵循其生命周期的任何提示?

这是我期望的单元测试行为,您正在单独测试控制器操作。如果你想一起测试授权过程和动作,那么这就形成了一个集成测试,并且需要一个网络托管环境来容纳 mvc 的完整网络生命周期。

我测试这个的方法是测试操作,然后进行检查属性是否存在的测试,这样如果有人删除或更改他们可能引入的意外属性,您就会收到警告行为。

然后您也可以单独测试您的授权属性,这样您就知道它独立于您的控制器操作工作。

您的问题是您并不真正了解 MVC 管道及其工作原理。 OnAuthorization 不会通过调用您的 Action 方法而神奇地被调用。它作为请求管道的一部分被框架调用,并且是一个集成点。

如果您想测试 OnAuthorization,您必须自己调用它。如果您想将其作为完整操作方法请求的一部分进行测试,则必须通过集成测试来完成。

我建议您阅读这篇文章,打印 PDF 并将张贴在您的工作站附近。它们会派上用场。

http://www.asp.net/mvc/overview/getting-started/lifecycle-of-an-aspnet-mvc-5-application