1

xUnit と FluentAssertions を使用して単体テストを記述していますが、次の問題で立ち往生しています。catchの(in GetCountriesAsync) はまだ実装していないWebExceptionので、ここに new を投入しNotImplementedExceptionます。

このコードは、テストを実際に期待どおりに機能させる唯一の方法です。FluentAssertions は単なるシンタックス シュガーであるため、ネイティブの xUnit 実装も追加しました。

[Fact]
public async Task GetCountriesAsyncThrowsExceptionWithoutInternetConnection()
{
    // Arrange
    Helpers.Disconnect(); // simulates network disconnect
    var provider = new CountryProvider();

    try
    {
        // Act
        var countries = await provider.GetCountriesAsync();
    }
    catch (Exception e)
    {
        // Assert FluentAssertions
        e.Should().BeOfType<NotImplementedException>();

        // Assert XUnit
        Assert.IsType<NotImplementedException>(e);
    }
}

この実装の方がはるかに優れていることがわかりましたが、機能しません。

[Fact]
public async Task GetCountriesAsyncThrowsExceptionWithoutInternetConnection3()
{
    // Arrange
    Helpers.Disconnect(); // simulates network disconnect
    var provider = new CountryProvider();

    // Act / Assert FluentAssertions
    provider.Invoking(async p => await p.GetCountriesAsync())
            .ShouldThrow<NotImplementedException>();

    // Act / Assert XUnit
    Assert.Throws<NotImplementedException>(async () => await provider.GetCountriesAsync());
}

VS2012/ReSharperasyncは、テスト メソッドの冗長なキーワードを削除することを既に提案しているため、 に置き換えasync Taskvoidも、テストは引き続き同じように動作するため、 async を待機Actionできないと思われます。

xUnit/FluentAssertions でこれを適切に実装する方法はありますか? のような機能が見られないので、最初の実装を使用する必要があると思いますInvokingAsync()

4

2 に答える 2