Как я могу выдать исключение, используя Fluent Assertions?

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

Я нашел сообщение о StackOverflow, которое выглядело очень похоже на проблему, с которой я столкнулся. В вопросе упоминается, что FluentAssertions не поддерживает асинхронные методы. Однако в примере кода для клиента я вижу, что метод 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 ответ


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

//...

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) {

    //...

}

Ссылка Async / Await - Лучшие практики в асинхронном программировании


Есть идеи?

10000