2017-04-03 69 views
4

我的应用程序是一个ASP.NET Core 1.0 Web API。集成测试使用[Authorize]属性装饰的控制器

正如标题所说:如何测试其装饰与Authorize属性的控制?

例如这个控制器和TestMethod的:

[TestMethod] 
    public void GetSomeDataTest() 
    { 
    var controller = new MyController(); 
    Assert.AreEqual(controller.GetSomeData(), "Test"); 
    } 

    [Authorize] 
    public ActionResult GetSomeData() 
    { 
    return this.Content("Test"); 
    } 

这仅仅是一个例子代码,使其能够为你们来回答。 Iam实际上通过TestServer对象调用Controller

already被要求,但接受的答案不工作了。 任何建议如何我可以“伪造”用户的真实性?

谢谢

回答

-1

那么你实际上并没有调用控制器,而你正在运行的模拟测试,因此没有什么是传统的方式发生像ASP.NET引擎处理您的请求 - >请求通过HTTP管道(因此授权模块)。

因此,在测试时,您应该只关注控制器操作方法的内部逻辑,而不是单元测试方法中的Authorize属性原因,否则不会进行身份验证/授权。您将设置模拟并调用控制器操作方法,同样也可以使用其他方法。

+0

您好感谢拉胡尔你为你的答案。但是有可能测试一个用[Authorize]属性装饰的控制器吗?如果是这样怎么可能? –

+0

Iam实际上是通过TestServer调用控制器,但我只是想让事情变得简单,那就是为什么我要张贴这段代码 –

+0

Moritz Schmidt,你如何在TestServer中使用Authorize? – Brian

4

你可以索赔原则设置为当前线程

[TestInitialize] 
public void Initialize() 
{ 
    var claims = new List<Claim>() 
    { 
     new Claim(ClaimTypes.Name, "UserName"), 
     new Claim(ClaimTypes.Role, "Admin") 
    }; 
    var identity = new ClaimsIdentity(claims, "TestAuth"); 
    var claimsPrincipal = new ClaimsPrincipal(identity); 
    Thread.CurrentPrincipal = claimsPrincipal; 
} 

更新

对于.NET核心您可以将用户设置到控制器上下文

private MyController _ctrl; 

[TestInitialize] 
public void Initialize() 
{ 
    var user = new ClaimsPrincipal(new ClaimsIdentity(new Claim[] 
    { 
     new Claim(ClaimTypes.Name, "UserName"), 
     new Claim(ClaimTypes.Role, "Admin") 
    })); 

    _ctrl = new MyController(); 
    _ctrl.ControllerContext = new ControllerContext() 
    { 
     HttpContext = new DefaultHttpContext() { User = user } 
    }; 
} 

[TestMethod] 
public void GetSomeDataTest() 
{ 
    Assert.AreEqual(_ctrl.GetSomeData(), "Test"); 
} 
+0

你好,谢谢你的回答。由于最后一行“Thread.CurrentPrincipal = claimsPrincipal;”,Visual Studio给了我一个错误。 错误是:“无法解析符号'CurrentPrincipal'” –

+1

@MoritzSchmidt您是否添加了名称空间“System.Threading” –

+0

是的,它似乎像CurrentPrincipial已弃用 –