【发布时间】:2017-08-25 09:03:51
【问题描述】:
我有一个异步 Command 类,如下所示:
public AsyncDelegateCommand(Func<Task> execute, Func<bool> canExecute)
{
this.execute = execute;
this.canExecute = canExecute;
}
public virtual bool CanExecute(object parameter)
{
if(executing)
return false;
if(canExecute == null)
return true;
return canExecute();
}
public async void Execute(object parameter) // Notice "async void"
{
executing = true;
CommandManager.InvalidateRequerySuggested();
if(parameter != null && executeWithParameter != null)
await executeWithParameter(parameter);
else if(execute != null)
await execute();
executing = false;
CommandManager.InvalidateRequerySuggested();
}
它是这样称呼的:
FindProductCommand = new AsyncDelegateCommand(TryToFindProduct, () => CanFindProduct() && connector.HasConnection);
private async Task TryToFindProduct()
{
//code
}
当我进行单元测试时,它工作得很好,因为我会立即从任务中返回。
但是,在编写集成测试时,我遇到了麻烦。我无法等待Execute,因为它是void,我无法将其更改为Task。我最终这样做了::/
findProductViewModel.FindProductCommand.Execute(null);
Thread.Sleep(2000);
var informationViewModel = findProductViewModel.ProductViewModel.ProductInformationViewModel;
Assert.AreEqual("AFG00", informationViewModel.ProductGroup);
此测试有更好的解决方案吗?可能取决于实际需要多长时间,并且不估计等待多长时间。
【问题讨论】:
标签: c# wpf unit-testing mvvm integration-testing