【问题标题】:Testing ASP.NET MVC5 Authentication?测试 ASP.NET MVC5 身份验证?
【发布时间】:2014-06-19 13:53:39
【问题描述】:

我们想对我们的 MVC5 web 应用程序的部分进行单元测试身份验证,但不清楚我们如何测试由[Authorize] 属性修饰的控制器/控制器方法。实例化控制器并调用该方法似乎忽略了 [Authorize] 属性。

类似地,一些控制器方法(例如:AccountControllerSignInAsync() 方法)最终会引用HttpContext 和它的对象层次结构中的Authentication 属性(下面的sn-p,标准MVC5 模板代码)。这使得很难正确进行单元测试。

那么对于如何有效地测试 MVC5 应用程序的身份验证方面,是否有人有一些想法或方法?似乎需要另一层来模拟 HTTP req/resp(即使那些 req/resp 不遍历网络堆栈)...

 1: private IAuthenticationManager AuthenticationManager
 2: {
 3:   get { HttpContext.GetOwinContext().Authentication; }
 4: }
 5: 
 6: private async Task SignInAsync(ApplicationUser user, bool isPersistent)
 7: {
 8:    AuthenticationManager.SignOut(DefaultAuthenticationTypes.ExternalCookie);
 9:    var identity = await UserManager.CreateIdentityAsync(user, DefaultAuthenticationTypes.ApplicationCookie);
10:    AuthenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = isPersistent }, identity);
11: }

【问题讨论】:

    标签: asp.net asp.net-mvc unit-testing authentication


    【解决方案1】:

    框架在调用方法之前使用反射来查找方法的属性,并在这些属性中执行方法。当您直接调用这些方法时,您并没有这样做..因此不会调用属性方法。

    您可以执行相同的代码来测试一个属性,然后调用它的方法。但一般来说,您不需要测试框架提供的功能。您只需要验证该属性是否存在并正确配置。

    然后,您将在稍后的过程中使用集成测试来确保实际登录过程正常工作。

    如果您想要测试该属性是否存在的示例,请参见此处:

    https://stackoverflow.com/a/670838/61164

    如果您有自己的授权过滤器,那么您绝对应该对其进行测试。您可以按照此处的建议进行操作:

    http://darioquintana.com.ar/blogging/2009/05/23/aspnet-mvc-testing-a-custom-authorize-filters/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-15
      • 1970-01-01
      • 2020-11-13
      • 2016-01-26
      • 1970-01-01
      • 1970-01-01
      • 2013-02-21
      相关资源
      最近更新 更多