Как проверить исключение в Nest? - PullRequest
0 голосов
/ 09 ноября 2018

Я пытаюсь проверить результаты некоторых исключений, когда 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 не очень устойчива. Как только модульный тест сработает, код, вероятно, получит больше любви.

1 Ответ

0 голосов
/ 10 ноября 2018

Тип возврата смоделированного клиента неверен, так как IElasticClient.GetAsync<> возвращает Task<IGetResponse<T>>.

Task<IGetResponse<T>> GetAsync<T>(IGetRequest request, CancellationToken cancellationToken = default(CancellationToken)) where T : class;

Источник

Таким образом, установка должна вернуть Task производный результат, чтобы разрешить асинхронный код

var response = await Client.GetAsync<Dictionary<string, object>>(request);

течет, как и ожидалось.

Например

[TestMethod]
[ExpectedException(typeof(NotFoundException))]
public async Task Get_ClientReturns404_ThrowsNotFoundException() {

    //Arrange
    var originalException = new Exception("Status code 404");

    var response = A.Fake<Nest.IGetResponse<Dictionary<string, object>>>();
    A.CallTo(() => response.OriginalException).Returns(originalException);

    var client = A.Fake<Nest.IElasticClient>();
    A.CallTo(() => 
        client.GetAsync<Dictionary<string, object>>(A<IGetRequest>._, A<CancellationToken>._)
    ).Returns(Task.FromResult(response));

    var request = new DataGetRequest {
        CollectionName = string.Empty,
        DocumentType = string.Empty,
        DataAccessType = string.Empty
    };

    var elasticSearch = new ElasticSearch(null, client);

    // Act
    var result = await elasticSearch.Get(request);

    // Assert
    Assert.Fail("Should have hit an exception.");
}
...