如何使用Fluent断言引发异常?

时间:2020-01-15 10:30:45

标签: c# mqtt fluent-assertions

我正在使用clientCloudMQTT API进行交互。我正在尝试create a user,但是在尝试了下面提供的代码之后,我无法创建用户。当使用Github存储库中提供的用于该项目的代码时,我注意到我无法使用ShouldThrow()方法(显然应该由Fluent Assertions提供)。

我确实在StackOverflow上找到了一个post,看上去与我遇到的问题非常相似。在提到的问题中,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 个答案:

答案 0 :(得分:4)

鉴于所示代码的异步特性,语法应为

//...

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: Exceptions

也请避免使用async void。让函数返回Task

public static async Task CreateCloudUser(ICloudMqttApi client) {

    //...

}

参考Async/Await - Best Practices in Asynchronous Programming

相关问题