Я пытаюсь проверить результаты некоторых исключений, когда Nest имеет значение в свойстве IGetResponse.OriginalException
.
Сначала я настроил ответ:
var response = A.Fake<Nest.IGetResponse<Dictionary<string, object>>>();
A.CallTo(() => response.OriginalException).Returns(new Exception("Status code 404"));
Тогда поддельный эластичный клиент:
var client = A.Fake<Nest.IElasticClient>();
A.CallTo(client)
.WithReturnType<Nest.IGetResponse<Dictionary<string, object>>>()
.Returns(response);
Клиент попадает в класс, который я тестирую.
Однако при пошаговом выполнении кода при вызове клиента он возвращает поддельный ответ, но метод получения OriginalException
не имеет значения. Это не нуль, но ни одно из свойств не имеет никакого значения. Я ожидал, что OriginalException.Message
будет равно Код состояния 404 .
Я также попытался установить объект ответа на:
var response = A.Fake<Nest.IGetResponse<Dictionary<string, object>>>();
A.CallTo(() => response.OriginalException.Message).Returns("Status code 404");
... с одинаково плохими результатами.
Как установить IGetResponse
, чтобы я мог оценить OriginalException.Message
в тестируемом классе?
Требуется больше кода. Я могу показать весь тест, и я покажу метод тестирования. Вот весь мой тест:
[TestMethod]
[ExpectedException(typeof(NotFoundException))]
public void Get_ClientReturns404_ThrowsNotFoundException()
{
// setup
var request = new DataGetRequest
{
CollectionName = string.Empty,
DocumentType = string.Empty,
DataAccessType = string.Empty
};
var response = A.Fake<Nest.IGetResponse<Dictionary<string, object>>>();
A.CallTo(() => response.OriginalException.Message).Returns("Status code 404");
var client = A.Fake<Nest.IElasticClient>();
A.CallTo(client)
.WithReturnType<Nest.IGetResponse<Dictionary<string, object>>>()
.Returns(response);
var elasticSearch = new ElasticSearch(null, client);
// test
var result = elasticSearch.Get(request);
// assert
Assert.Fail("Should have hit an exception.");
}
}
А вот метод, который тестируется:
public async Task<Dictionary<string, object>> Get(DataGetRequest getRequest)
{
GetRequest request = new GetRequest(getRequest.CollectionName, getRequest.DocumentType, getRequest.Id);
var response = await Client.GetAsync<Dictionary<string, object>>(request);
if (response.OriginalException != null)
{
var message = response.OriginalException.Message;
if (message.Contains("Status code 404"))
throw new NotFoundException(String.Format("Not Found for id {0}", getRequest.Id));
else
throw new Exception(message);
}
return response.Source;
}
Обработка ошибок в блоке IF не очень устойчива. Как только модульный тест сработает, код, вероятно, получит больше любви.