C# 如何编写单元测试用例IHttpClientFactory
我在服务层有一个连接到服务的方法,我正在使用C# 如何编写单元测试用例IHttpClientFactory,c#,asp.net,asp.net-core,httpclientfactory,C#,Asp.net,Asp.net Core,Httpclientfactory,我在服务层有一个连接到服务的方法,我正在使用IHttpClientFactory。我的方法很有效。现在我正试图为同样的问题编写单元测试用例 public async Task<MyObject> MyMethodAsync(string arg1, string arg2) { var client = _httpClientFactory.CreateClient("XYZ"); var Authkey = "abc";
IHttpClientFactory
。我的方法很有效。现在我正试图为同样的问题编写单元测试用例
public async Task<MyObject> MyMethodAsync(string arg1, string arg2)
{
var client = _httpClientFactory.CreateClient("XYZ");
var Authkey = "abc";
var AuthToken = "def";
var headers = new Dictionary<string, string>
{
{ Authkey,AuthToken }
};
client.AddTokenToHeader(headers); //This method set the DefaultRequestheader from the dictionary object
var reqData = new
{
prop1 = "X",
prop2 = "Y"
};//req object
var content = new StringContent(JsonConvert.SerializeObject(reqData), Encoding.UTF8, "application/json");
//This is httpClient Post call for posting data
HttpResponseMessage response = await client.PostAsync("postData", content);
if (!response.IsSuccessStatusCode || response.Content == null)
{
return null;
}
MyObject myObject = JsonConvert.DeserializeObject<MyObject>(response.Content.ReadAsStringAsync().Result);//read the result to an object
return myObject;
}
有人能告诉我我在这里犯了什么错误吗?例外情况是你必须这样做
- 使用绝对url调用
PostAsync
- 或者设置HttpClient的
BaseAddress
var httpClient=newhttpclient(_httpMessageHandler.Object);
httpClient.BaseAddress=新Uri(“http://nonexisting.domain"); //新代码
mockFactory.Setup(=>wk.CreateClient(It.IsAny())).Returns(httpClient);
通过此修改,例外情况将消失。
但是您的测试将失败,因为
响应.Content
将为null
,这就是为什么MyMethodAsync
将返回null
要解决此问题,请将设置更改为:
public static async Task MyMethodAsync_Gets_True()
{
//Arrange
MyObject resultObject = new MyObject();
var response = new HttpResponseMessage(HttpStatusCode.OK)
{
Content = new StringContent(JsonConvert.SerializeObject(resultObject))
};
var _httpMessageHandler = new Mock<HttpMessageHandler>();
_httpMessageHandler.Protected()
.Setup<Task<HttpResponseMessage>>("SendAsync",
ItExpr.Is<HttpRequestMessage>(req => req.Method == HttpMethod.Post),
ItExpr.IsAny<CancellationToken>())
.ReturnsAsync(response);
...
//Act
var result = await service.MyMethodAsync(arg1, arg2);
//Assert
Assert.NotNull(result);
}
publicstaticasync任务MyMethodAsync\u Gets\u True()
{
//安排
MyObject resultObject=新的MyObject();
var响应=新的HttpResponseMessage(HttpStatusCode.OK)
{
内容=新的StringContent(JsonConvert.SerializeObject(resultObject))
};
var_httpMessageHandler=new Mock();
_httpMessageHandler.Protected()
.Setup(“SendAsync”,
ItExpr.Is(req=>req.Method==HttpMethod.Post),
ItExpr.IsAny())
.ReturnsAsync(答复);
...
//表演
var result=await service.MyMethodAsync(arg1,arg2);
//断言
Assert.NotNull(结果);
}
我已修改以添加基地址。
public static async Task MyMethodAsync_Gets_True()
{
//Arrange
MyObject resultObject = new MyObject();
var response = new HttpResponseMessage(HttpStatusCode.OK)
{
Content = new StringContent(JsonConvert.SerializeObject(resultObject))
};
var _httpMessageHandler = new Mock<HttpMessageHandler>();
_httpMessageHandler.Protected()
.Setup<Task<HttpResponseMessage>>("SendAsync",
ItExpr.Is<HttpRequestMessage>(req => req.Method == HttpMethod.Post),
ItExpr.IsAny<CancellationToken>())
.ReturnsAsync(response);
...
//Act
var result = await service.MyMethodAsync(arg1, arg2);
//Assert
Assert.NotNull(result);
}