在C#的单元测试中,因为Mock只能对接口进行mock,所以无法mock一个HttpClient的实例,经调研记录一下Mock的方法:
var httpMessageHanlderMocker = new Mock<HttpMessageHandler>();
httpMessageHanlderMocker.Protected().Setup<Task<HttpResponseMessage>>("SendAsync",
ItExpr.IsAny<HttpRequestMessage>(),
ItExpr.IsAny<CancellationToken>())
.ReturnsAsync(new HttpResponseMessage
{
StatusCode = System.Net.HttpStatusCode.OK,
Content = new StringContent("Here text your response message.")
});
HttpClient httpClient = new HttpClient(httpHanlderMocker.Object);
Mock<IHttpContextAccessor>
var httpContextAccessor = new Mock<IHttpContextAccessor>();
var context = new DefaultHttpContext();
httpContextAccessor.Setup(a => a.HttpContext).Returns(context);
在Controller中Mock ClaimsPrincipal:
var user = new ClaimsPrincipal(new ClaimsIdentity(new Claim[]
{
new Claim(ClaimTypes.Name, "example name"),
new Claim(ClaimTypes.NameIdentifier, "1"),
new Claim("custom-claim", "example claim value"),
}, "mock"));
var controller = new SomeController(dependencies…);
controller.ControllerContext = new ControllerContext()
{
HttpContext = new DefaultHttpContext() { User = user }
};