集成测试使用[Authorize]属性装饰的控制器
我的应用程序是一个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被要求,但接受的答案不工作了。 任何建议如何我可以“伪造”用户的真实性?
谢谢
那么你实际上并没有调用控制器,而你正在运行的模拟测试,因此没有什么是传统的方式发生像ASP.NET引擎处理您的请求 - >请求通过HTTP管道(因此授权模块)。
因此,在测试时,您应该只关注控制器操作方法的内部逻辑,而不是单元测试方法中的Authorize
属性原因,否则不会进行身份验证/授权。您将设置模拟并调用控制器操作方法,同样也可以使用其他方法。
你可以索赔原则设置为当前线程
[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");
}
你好,谢谢你的回答。由于最后一行“Thread.CurrentPrincipal = claimsPrincipal;”,Visual Studio给了我一个错误。 错误是:“无法解析符号'CurrentPrincipal'” –
@MoritzSchmidt您是否添加了名称空间“System.Threading” –
是的,它似乎像CurrentPrincipial已弃用 –
您好感谢拉胡尔你为你的答案。但是有可能测试一个用[Authorize]属性装饰的控制器吗?如果是这样怎么可能? –
Iam实际上是通过TestServer调用控制器,但我只是想让事情变得简单,那就是为什么我要张贴这段代码 –
Moritz Schmidt,你如何在TestServer中使用Authorize? – Brian