MsTests MVC5控制器未触发OnAuthorization

时间:2015-01-25 14:08:32

标签: c# asp.net-mvc-5 tdd bdd

我正在测试当前项目的控制器操作。有一个方法来模拟已记录的用户,所以我可以控制对数据本身的访问,在我忘记模拟用户的方法之一上我感到惊讶,而不是获得重定向(当你是非匿名操作时定义的行为没记录),动作完美执行。 我调试并发现没有调用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.
    }
}

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

2 个答案:

答案 0 :(得分:1)

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

我测试它的方法是测试操作,然后进行测试以检查属性是否存在,这样一来,如果有人删除或更改了可能引入意外行为的属性,则可以发出警告。

然后,您也可以单独测试授权属性,因此您知道它与控制器操作无关。

答案 1 :(得分:1)

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

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

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

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