【发布时间】:2015-03-17 04:14:20
【问题描述】:
进行单元测试,测试仅在Jobs.Count > 0 时才允许导航。
GetJobsAsync() 在构造过程中被调用,如果不为空则清除 Jobs 列表(每次调用时获取新列表)。在我手动添加新作业作为单元测试通过的条件后,作业列表似乎已清除。如何正确设置此时间,以便在测试运行期间不会清除作业列表?
在 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);
【问题讨论】:
-
这就是为什么你没有
async void不是顶级方法的方法。 -
最好的做法不是设置 DataService 来返回作业吗?这样,测试流程就可以尽可能准确地模拟生产流程。通常我会通过在我的单元测试中使用一个 Mock DataService 对象来做到这一点。
-
问题是,在真正的应用程序中,你有一个 SynchronizationContext 来保持单线程并为你维护顺序,而在单元测试中你没有一个,所以多个线程是跑步,你有一个比赛条件。
-
@SilasReinagel - 不确定,应该没问题,但问题仍然存在。
标签: c# unit-testing asynchronous async-await .net-4.5.2