C# 调用HttpClient GetStreamAsync时如何模拟流响应

C# 调用HttpClient GetStreamAsync时如何模拟流响应,c#,unit-testing,testing,moq,C#,Unit Testing,Testing,Moq,我试图测试一个使用HttpClient的类,我必须伪造流响应 这就是我要测试的代码 try { _httpClient.Timeout = TimeSpan.FromMinutes(10); _httpClient.BaseAddress = new Uri(BaseAddress); _httpClient.DefaultRequestHeaders.

我试图测试一个使用HttpClient的类,我必须伪造流响应

这就是我要测试的代码

            try
            {
                _httpClient.Timeout = TimeSpan.FromMinutes(10);
                _httpClient.BaseAddress = new Uri(BaseAddress);
                _httpClient.DefaultRequestHeaders.Accept.Clear();
                _httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                _httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", _credentials);

                using (Stream s = _httpClient.GetStreamAsync(API_string).Result)  <---- this is the trouble line.
                using (StreamReader sr = new StreamReader(s))
                using (JsonReader reader = new JsonTextReader(sr))
                {
                    JsonSerializer serializer = new JsonSerializer();

                    return serializer.Deserialize<T>(reader); //breaks loop
                }
            }
试试看
{
_httpClient.Timeout=TimeSpan.FromMinutes(10);
_httpClient.BaseAddress=新Uri(BaseAddress);
_httpClient.DefaultRequestHeaders.Accept.Clear();
_httpClient.DefaultRequestHeaders.Accept.Add(新的MediaTypeWithQualityHeaderValue(“应用程序/json”);
_httpClient.DefaultRequestHeaders.Authorization=新的AuthenticationHeaderValue(“基本”,_凭证);
使用(streams=_httpClient.GetStreamAsync(API_string.Result)
var Stream=newmemorystream();
var httpResponse=新的HttpResponseMessage
{
StatusCode=HttpStatusCode.OK,
内容=新的流内容(流)
};
var handlerMock=new Mock();
handlerMock
.Protected()
.设置(
“SendAsync”,
ItExpr.IsAny(),
ItExpr.IsAny())
.ReturnsAsync(httpResponse);

你说它中断是什么意思?它会引发异常吗?断言会失败吗?如果是的话,你在断言什么?有点不相关,但有一个库有一个叫做RestClient的东西。它包装了HttpClient,在提供各种性能优势的同时,它还引入了一个接口IRestClient,这意味着你可以测试它ngs非常简单,因为您可以模拟自己的客户端。显然,需要引入新的依赖项或一些外部代码并更改您的接口,但可能值得一看。在这里可以找到它。对我来说,它看起来像是在测试.net类(这将是Microsoft的工作)-您希望测试的代码的行为是什么?一旦我获取数据,它将发送回请求Http调用的主方法,然后处理这些数据。问题是,进行Http调用的方法是通用的,并且使用了多次,因此我必须伪造每种不同类型的调用。
    public HttpClientHandler MockHttpClientHandler()
    {
        var requestUri = new Uri("Uri.Expected.To.Be.Called");
        var expectedResponse = "Response text"; <-- This is where i need to write the Object to be returned.

        var mockResponse = new HttpResponseMessage(HttpStatusCode.OK) { Content = new StringContent(expectedResponse) };
        var mockHandler = new Mock<HttpClientHandler>();
        mockHandler
            .Protected()
            .Setup<Task<HttpResponseMessage>>(
                "SendAsync",
                ItExpr.Is<HttpRequestMessage>(message => message.RequestUri == requestUri),
                // ItExpr.IsAny<HttpRequestMessage>(),
                ItExpr.IsAny<CancellationToken>())
            .Returns(Task.FromResult(mockResponse));

        return mockHandler.Object;
    }
        var stream = new MemoryStream();

        var httpResponse = new HttpResponseMessage
        {
            StatusCode = HttpStatusCode.OK,
            Content = new StreamContent(stream)
        };

        var handlerMock = new Mock<HttpMessageHandler>();
        handlerMock
            .Protected()
            .Setup<Task<HttpResponseMessage>>(
                  "SendAsync",
                  ItExpr.IsAny<HttpRequestMessage>(),
                  ItExpr.IsAny<CancellationToken>())
           .ReturnsAsync(httpResponse);