我的应用程序是ASP.NET Core 1.0 Web API。
正如标题所说:我如何测试用Authorize
属性修饰的控制器?
例如,使用此控制器和testmethod:
[TestMethod]
public void GetSomeDataTest()
{
var controller = new MyController();
Assert.AreEqual(controller.GetSomeData(), "Test");
}
[Authorize]
public ActionResult GetSomeData()
{
return this.Content("Test");
}
这只是一个示例代码,让您可以回答。 Iam实际上是通过Controller
对象调用TestServer
。
这已被already提出,但已接受的答案已不再适用。 任何建议我如何"假"用户的真实性?
谢谢
答案 0 :(得分: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 Core,您可以将用户设置为控制器上下文
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");
}
答案 1 :(得分:-2)
嗯,你实际上并没有调用控制器,而是你正在运行一个模拟测试,因此没有任何事情像传统方式那样发生,比如处理你的请求的ASP.NET引擎 - &gt;请求通过HTTP管道传递(因此授权模块)。
因此,在测试时,您应该只关注控制器操作方法的内部逻辑,而不是单元测试方法中的Authorize
属性原因,不会发生认证/授权。您将设置模拟并以任何其他方法调用控制器操作方法。