用 [Authorize] 属性装饰的控制器的集成测试
Integration test on controller decorated with [Authorize] attribute
我的应用程序是 ASP.NET Core 1.0 Web API。
如何测试装饰有 Authorize
属性的控制器?
例如,使用此控制器和测试方法:
[TestMethod]
public void GetSomeDataTest()
{
var controller = new MyController();
Assert.AreEqual(controller.GetSomeData(), "Test");
}
[Authorize]
public ActionResult GetSomeData()
{
return this.Content("Test");
}
这只是一个示例代码,可以让你们回答。我实际上是通过 TestServer
对象调用 Controller
。
这有 already been asked 但已接受的答案不再有效。
有什么建议可以“伪造”用户的真实性吗?
好吧,您实际上并没有调用控制器。相反,您是 运行 一个模拟测试,因此没有像 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 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");
}
我的应用程序是 ASP.NET Core 1.0 Web API。
如何测试装饰有 Authorize
属性的控制器?
例如,使用此控制器和测试方法:
[TestMethod]
public void GetSomeDataTest()
{
var controller = new MyController();
Assert.AreEqual(controller.GetSomeData(), "Test");
}
[Authorize]
public ActionResult GetSomeData()
{
return this.Content("Test");
}
这只是一个示例代码,可以让你们回答。我实际上是通过 TestServer
对象调用 Controller
。
这有 already been asked 但已接受的答案不再有效。 有什么建议可以“伪造”用户的真实性吗?
好吧,您实际上并没有调用控制器。相反,您是 运行 一个模拟测试,因此没有像 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 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");
}