13

非同期メソッドが具体的な例外をスローすることを確認しようとしています。

そのために、MSTEST と FluentAssertions 2.0.1 を使用しています。

Codeplex に関するこのディスカッションを確認し、非同期例外メソッドでどのように機能するかを確認するために、FluentAssertions 非同期テストに関する別のリンクを確認しました。

しばらくして「プロダクション」コードを操作しようとした後、Fluentassertions の偽の aync クラスに切り替えました。結果のコードは次のようになります (このコードを[TestClass]:の中に入れます)。

[TestMethod]
public void TestThrowFromAsyncMethod()
{
    var asyncObject = new AsyncClass();
    Action action = () =>
    {
        Func<Task> asyncFunction = async () =>
        {
            await asyncObject.ThrowAsync<ArgumentException>();
        };
        asyncFunction.ShouldNotThrow();
    };
}


internal class AsyncClass
{
    public async Task ThrowAsync<TException>()
        where TException : Exception, new()
    {
        await Task.Factory.StartNew(() =>
        {
            throw new TException();
        });
    }

    public async Task SucceedAsync()
    {
        await Task.FromResult(0);
    }
}

問題は、それShouldNotThrowが有効でないことです:

コードは ShouldNotThrow メソッドを認識しません。コンパイルしようとすると、次のエラーが表示されます。 ' 無効な引数があります

ありがとう。


解決

2.0.1 FA バージョンはこの機能をサポートしておらずShouldNotThrow、次のリリース 2.1 (来週近く) に含まれる予定です。

注: ShouldThrow は 2.0.1 バージョンで既にサポートされています。

4

2 に答える 2

17

包括的なアクションは必要ありません。これは、API が正しい例外をスローしていることを確認するために単体テストでのみ使用されます。これで十分です。

[TestMethod]
public void TestThrowFromAsyncMethod()
{
    Func<Task> asyncFunction = async () =>
    {
        await asyncObject.ThrowAsync<ArgumentException>();
    };

    asyncFunction.ShouldNotThrow();
}

残念ながら、.NET 4.5 には Func の ShoudlNotThrow() がありません。リリース 2.1 でこれを修正しました (現在はドッグフーディング中)。

于 2013-08-15T06:09:39.880 に答える
1

AssertionExtensions.cs クラスを見ると、Func の ShouldNotThrow 拡張メソッドが net45 または winrt コンパイル ターゲットに対してのみ定義されていることがわかります。

これをチェックして:

  1. 単体テスト プロジェクトが .net 4.5 または winrt 上にある
  2. 参照されているアサーション ライブラリは .net 4.5 のものです。参照されている FluentAssertions ライブラリを適切なものに変更しない場合は、.

また、これを行った後、アクション メソッドを呼び出してアサーションを実行する必要があると思います。そうしないと、内部ラムダが呼び出されません。

[TestMethod]
public void TestThrowFromAsyncMethod()
{
    var asyncObject = new AsyncClass();
    Action action = () =>
    {
        Func<Task> asyncFunction = async () =>
        {
            await asyncObject.ThrowAsync<ArgumentException>();
        };
        asyncFunction.ShouldNotThrow();
    };

    action.ShouldNotThrow();
}
于 2013-08-14T22:51:35.910 に答える