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 Task
てvoid
も、テストは引き続き同じように動作するため、 async を待機Action
できないと思われます。
xUnit/FluentAssertions でこれを適切に実装する方法はありますか? のような機能が見られないので、最初の実装を使用する必要があると思いますInvokingAsync()
。