构造函数中的异步方法影响单元测试

时间:2015-03-16 19:47:50

标签: c# unit-testing asynchronous async-await .net-4.5.2

进行单元测试,仅在Jobs.Count > 0时测试导航。 如果不是null,则在构造期间调用GetJobsAsync()并清除作业列表(每次调用时都会获取新列表)。在我手动添加新作业作为单元测试通过的条件后,似乎清除了作业列表。如何确保此时间正确,以便在测试运行期间清除作业列表?

在MyClass构造函数中

this.GetJobsAsync();

GetJobsAsync

private async void GetJobsAsync()
{
    var jobs = await this.dataService.GetJobs();
    if (jobs != null)
    {
        this.Jobs.Clear();

        foreach (var job in jobs)
        {
            this.Jobs.Add(new JobViewModel(job));
        }
    }

    // have the select job command rerun its condition
    this.SelectJobCommand.RaiseCanExecuteChanged();
}

单元测试(必须至少有一个导航作业,添加作业后清除作业):

var vm = new MyClass();
vm.Jobs.Add(new JobVM(new JobModel()));
vm.SelectJobCommand.Execute(null);            
Assert.AreEqual(
  NavigationKeys.WizardJob,
  this.navigationService.CurrentPageKey);

1 个答案:

答案 0 :(得分:2)

  

在手动添加新作业作为单元测试通过的条件后,似乎清除了作业列表。

很明显,你明白你有竞争条件。您无法等待async void,而且您在构造函数中。

  

如何确保此时间正确,以便在测试运行期间清除作业列表?

两件事。首先,将GetJobAsync更改为async Task而不是async void。然后,使用异步初始化模式:

public class MyClass
{
    public Task InitializeAsync()
    {
         return GetJobsAsync();
    }
}

在你的单元测试中:

public async Task TestNavigationAsync()
{
     var vm = new MyClass();
     await vm.InitializeAsync();

     vm.Jobs.Add(new JobVM(new JobModel()));
     vm.SelectJobCommand.Execute(null);       

     Assert.AreEqual(NavigationKeys.WizardJob,
                                  navigationService.CurrentPageKey); 
 }

这将确保执行顺序。