1

非同期メソッドをテストする初心者の問題があります。非同期メソッドで書き込みテストを修正する方法など、他のいくつかの投稿を読みましたか? 、そして私は物事を正しくやっていると思いますが、明らかに何かが欠けています。

テストしようとしているコードは次のとおりです。

/// <summary>
/// Temporary method used to simulate the time required to generate a report.
/// </summary>
public virtual async Task GenerateTestReportAsync()
{
    ++ActiveTaskCounter;

    await Task.Delay(2000);

    --ActiveTaskCounter;
}

テストは次のとおりです (はい、ActiveTaskCounter 値をリストに格納することで改善できます/改善する必要がありますが、それは重要ではありません)。

[TestMethod]
public async Task GenerateTestReportAsyncUpdatesActiveTaskCounter()

    var bayViewModel = CreateBayViewModel();

    var invocationCount = 0;
    bayViewModel.PropertyChanged += (sender, args) =>
        {
            if (args.PropertyName == "ActiveTaskCounter")
            {
                ++invocationCount;
            }
        };

    await bayViewModel.GenerateTestReportAsync();

    //Thread.Sleep(2100); // TODO: Why is this needed?
    Assert.AreEqual(2, invocationCount);
    Assert.AreEqual(0, bayViewModel.ActiveTaskCounter);
}

Thread.Sleep のコメントを外すと、テストは常にパスします。上記のように、コメントされた Thread.Sleep で常に失敗します。どうしてこれなの?「await bayViewModel.GenerateTestReportAsync()」の下のコードは、GenerateTestReportAsync が実際に完了するまで実行されないと想定しました。

ところで、私は使用しています: Microsoft Visual Studio Ultimate 2012 バージョン 11.0.51106.01 Update 1 Microsoft .NET Framework バージョン 4.5.50709

ご協力いただきありがとうございます。これには困惑しました :-|

編集:これはビューモデルクラスの最小限の再現です...

using System.ComponentModel;
using System.Threading.Tasks;

public class BayViewModel : INotifyPropertyChanged
{
    public BayViewModel()
    {
        PropertyChanged = (sender, args) => { };
    }

    public event PropertyChangedEventHandler PropertyChanged;

    private int _activeTaskCounter;
    public int ActiveTaskCounter
    {
        get
        {
            return _activeTaskCounter;
        }
        set
        {
            _activeTaskCounter = value;
            PropertyChanged(this, new PropertyChangedEventArgs("ActiveTaskCounter"));
        }
    }

    public virtual async Task GenerateTestReportAsync()
    {
        ++ActiveTaskCounter;

        await Task.Delay(2000);

        --ActiveTaskCounter;
    }
}
4

0 に答える 0