2

単体テストは初めてで、タスクを使用するWPFViewModelの単体テストを作成しようとしています。WPFのボタンに接続されているVMのメソッドがあります。以下のコードは、私がやろうとしていることを要約したものです。クラスMainPageViewModel{プライベートIServiceサービス_;

    public void StartTask()
    {
        var task = service_.StartServiceAsync();
        task.ContinueWith(AfterService);
    }

    private void AfterService(Task<IResult> result)
    {
        //update UI with result
    }
}

class TestClass
{
    [TestMethod]
    public Test_StartTask()
    {
        MainPageViewModel vm = new MainPageViewModel();
        vm.StartTask();
        //need to check if UI is updated but since the AfterService is called on a different thread the assert fails

    }
}

私のテストメソッドでは、StartTask()呼び出しの後にAssertを記述できません。そのようなシナリオを処理する方法について教えてください。TIA。

4

1 に答える 1

0

待機する同期プリミティブを追加できます。実稼働ビルドでこれを回避したくない場合は、#if _DEBUGまたは#if UNIT_TESTUNIT_TESTテスト固有のビルド構成用に定義されている)で保護できます。

class MainPageViewModel
{
    private IService service_;
    public AutoResetEvent UpdateEvent = new AutoResetEvent(false);

    public void StartTask()
    {
        var task = service_.StartServiceAsync();
        task.ContinueWith(AfterService);
    }

    private void AfterService(Task<IResult> result)
    {
        //update UI with result
        UpdateEvent.Set();
    }
}

class TestClass
{
    [TestMethod]
    public Test_StartTask()
    {
        MainPageViewModel vm = new MainPageViewModel();
        vm.StartTask();
        if( vm.UpdateEvent.WaitOne(5000) ) {
           // check GUI state
        } else {
           throw new Exception("task didn't complete");
        }

    }
}
于 2013-02-08T02:57:15.697 に答える