编写单元测试.Net中的Continuation任务

时间:2013-02-08 02:16:46

标签: .net unit-testing c#-4.0 task

我是单元测试的新手,并尝试为使用任务的WPF ViewModel编写单元测试。我在VM中有一个连接到WPF中的Button的方法。下面的代码总结了我想要做的事情。     类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。

1 个答案:

答案 0 :(得分:0)

您可以添加同步原语以等待。如果您不希望在生产版本中使用它,则可以使用#if _DEBUG#if UNIT_TEST(其中UNIT_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");
        }

    }
}