Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何编写单元测试用例IHttpClientFactory_C#_Asp.net_Asp.net Core_Httpclientfactory - Fatal编程技术网

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);
}