进行单元测试,仅在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);
答案 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);
}
这将确保执行顺序。