Хотя вопрос, по-видимому, не имеет полного объяснения, приведенное ниже описание используется в демонстрационных целях, чтобы показать, как протестировать целевой метод с помощью moq.
Предполагая следующее
public interface IRetryHttpRequest {
Task<HttpResponseMessage> ExecuteAsync(Func<HttpRequestMessage> requestMessage, HttpClient client, int maxTryValue);
}
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 interface ILibraryService {
}
Обратите внимание на синтаксические изменения, которые привели бы к ошибкам с исходным кодом, показанным в вопросе.
Следующий тест демонстрирует, как протестировать метод LibraryService.GetResponse
и подтвердить ожидаемое поведение
public async Task SampleTest() {
//Arrange
var content = new StringContent("{}", Encoding.UTF8, "application/json");
var httpResponse = new HttpResponseMessage() {
StatusCode = HttpStatusCode.OK,
Content = content
};
var _mockRetryHttpRequest = new Mock<IRetryHttpRequest>();
_mockRetryHttpRequest
.Setup(_ => _.ExecuteAsync(It.IsAny<Func<HttpRequestMessage>>(), It.IsAny<HttpClient>(), It.IsAny<int>()))
.ReturnsAsync(httpResponse);
var lgService = new LibraryService(_mockRetryHttpRequest.Object);
//Act
var response = await lgService.GetResponseForSearch(new SearchRequest(), null);
//Assert
response.Should().NotBeNull();
}
FluentAssertions использовался для подтверждения ожидаемого поведения.
Некоторые моменты, на которые следует обратить внимание
Испытуемому субъекту были предоставлены только те зависимости, которые фактически необходимы для выполнения теста до его завершения. Что означает, что HttpClient
на самом деле не нужно для макета
Для получения ответа на утверждение необходимо также ожидать тестируемого метода.
Поскольку у меня нет доступа к вашим тестовым данным, я использовал пустой объект JSON "{}" для представления содержимого ответа, чтобы позволить JsonConvert
работать
Тогда я бы посоветовал вам просмотреть данные тестов, которые десериализованы. Это может быть причиной отказа, поскольку это единственное место, где result
может быть установлено на null
, поскольку оно инициализируется в верхней части функции.