【发布时间】:2019-05-24 18:00:07
【问题描述】:
我在 XUnit 测试中使用 Moq。在依赖方法中,它包含一个Func<HttpResponseMessage> 参数。这是我写的单元测试:
[Fact]
public async Task Test()
{
//Arrange
var content = new StringContent(TestData.GetResponse().ToString(), Encoding.UTF8, "application/json");
var httpResponse = new HttpResponseMessage()
{
StatusCode = HttpStatusCode.OK,
Content = content
};
_mockRetryHttpRequest.Setup(x => x.ExecuteAsync(It.IsAny<Func<HttpRequestMessage>>(), It.IsAny<HttpClient>(), It.IsAny<int>()))
.ReturnsAsync(httpResponse);
var libraryService = new LibraryService(_mockRetryHttpRequest.Object);
//Act
var response = await libraryService.GetResponseForSearch(new SearchRequest(), null);
//Assert
response.Should().NotBeNull();
}
这是我需要测试的实际方法
public class LibraryService : ILibraryService
{
private IRetryHttpRequest _retryHttpRequest;
public LibraryService(IRetryHttpRequest retryHttpRequest)
{
_retryHttpRequest = retryHttpRequest;
}
public async Task<ResponseModel> GetResponseForSearch(SearchRequest searchRequest, HttpClient client)
{
//send request and retry if failed
ResponseModel result = new ResponseModel();
HttpResponseMessage httpResponseMessage = await _retryHttpRequest.ExecuteAsync(() => new HttpRequestMessage(), client, 3);
//process response
if (httpResponseMessage != null)
{
string response = await httpResponseMessage.Content.ReadAsStringAsync();
result = JsonConvert.DeserializeObject<ResponseModel>(response);
}
return result;
}
}
public class RetryHttpRequest : IRetryHttpRequest
{
public async Task<HttpResponseMessage> ExecuteAsync(Func<HttpRequestMessage> requestMessage, HttpClient client, int maxTryValue)
{
var content = new StringContent("From Execute Async", Encoding.UTF8, "application/json");
var httpResponse = new HttpResponseMessage()
{
StatusCode = HttpStatusCode.OK,
Content = content
};
return httpResponse;
}
}
当我单步执行代码时,对于下面这行代码,httpResponseMessage 变量正在返回 null,尽管我已经在单元测试中用 200 响应模拟了它。
HttpResponseMessage httpResponseMessage = await _retryHttpRequest.ExecuteAsync(() => new HttpRequestMessage(), client, 3);
【问题讨论】:
-
我认为你应该像
var response = await lgService.GetResponse一样等待它 -
@CodingYoshi 仍然没有解决问题:(
-
在 mock 的
Returns部分放置一个断点,看看它是否被命中。 -
使用
.Returns( async () => ... -
@superninja 首先,您发布的代码无法编译。要获得帮助,请始终确保发布的代码可以编译。其次,一旦编译错误得到修复,一切正常,
httpResponseMessage不为空。这意味着您正在做一些您没有告诉我们的事情,并且它没有在发布的代码中体现出来。如果您想查看我的示例,请告诉我,我会将其发布为您查看的答案。
标签: c# unit-testing asp.net-core moq xunit