Как я могу выдать исключение, используя Fluent Assertions? - PullRequest
3 голосов
/ 15 января 2020

Я использую клиент для взаимодействия с CloudMQTT API . Я пытаюсь создать пользователя , но после попытки кода, приведенного ниже, я не смог создать пользователя. При использовании кода, предоставленного в репозитории Github для этого проекта, я заметил, что не могу использовать метод ShouldThrow() (очевидно, он должен быть предоставлен Fluent Assertions ).

Я нашел сообщение в StackOverflow, которое выглядело очень похоже на проблему, с которой я столкнулся. В вопросе упоминается, что FluentAssertions не поддерживает асин c методы. Однако в примере кода для клиента я вижу, что метод ShouldThrow() используется независимо от этого факта.

Как мне заставить ShoudldThrow() работать или мне даже нужно, чтобы он работал (потому что я думаю, что в этом коде это требуется только в том случае, если вы применяете модульное тестирование)?

Это то, что уже опробовано:

public static async void CreateCloudUser(ICloudMqttApi client)
{
    var users = await client.GetUsers();
    Console.WriteLine($"Creating a user. Current users available: {users.Count}");
    var expectedUser = new NewUser
    {
        Password = $"{Guid.NewGuid()}",
        Username = $"staging-{Guid.NewGuid()}",
    };

    var createUserResponse = await client.CreateUser(expectedUser);
    createUserResponse.IsSuccessStatusCode.Should().BeTrue();

    var actual = await client.GetUser(expectedUser.Username);
    actual.Should().NotBeNull();
    actual.Username.Should().Be(expectedUser.Username);

    //users.Should().Contain(u => u.Username == expectedUser.Username); // <-- This throws an exception as well, but not of importance for this specific question.

    Func<Task> verifyUser = async () => await client.GetUser(expectedUser.Username);
    verifyUser.ShouldThrow<ApiException>() // <-- Not recognized
            .And.StatusCode.Should().Be(HttpStatusCode.NotFound);

    Console.WriteLine($"Created a user. Current users available: {users.Count}");
}

Клиент определен в способ, указанный в документации для клиента прямо перед вызовом метода:

var client = CloudMqttApi.GetInstance("username", "password");

Число пользователей будет иметь одинаковое число до и после выполнения метода (который, очевидно, должен был увеличиться).

1 Ответ

4 голосов
/ 15 января 2020

Учитывая асинхронный характер показанного кода, синтаксис должен быть

//...

var deleteResponse = await client.DeleteUser(expectedUser.Username);
deleteResponse.IsSuccessStatusCode.Should().BeTrue();

Func<Task> verifyUser = async () => await client.GetUser(expectedUser.Username);

var exceptionAssertion = await verifyUser.Should().ThrowAsync<ApiException>();
exceptionAssertion.And.StatusCode.Should().Be(HttpStatusCode.NotFound);

//...

Ссылка FluentAssertions: Исключения

Также избегайте использования async void. Функция возврата Task

public static async Task CreateCloudUser(ICloudMqttApi client) {

    //...

}

Ссылка Асинхронное / ожидание - Лучшие практики асинхронного программирования

...