我有一个方法如下:

private async void DoStuff(long idToLookUp)
{
    IOrder order = await orderService.LookUpIdAsync(idToLookUp);   

    // Close the search
    IsSearchShowing = false;
}    

//Other stuff in case you want to see it
public DelegateCommand<long> DoLookupCommand{ get; set; }
ViewModel()
{
     DoLookupCommand= new DelegateCommand<long>(DoStuff);
}    

我try 这样进行单元测试:

[TestMethod]
public void TestDoStuff()
{
    //+ Arrange
    myViewModel.IsSearchShowing = true;

    // container is my Unity container and it setup in the init method.
    container.Resolve<IOrderService>().Returns(orderService);
    orderService = Substitute.For<IOrderService>();
    orderService.LookUpIdAsync(Arg.Any<long>())
                .Returns(new Task<IOrder>(() => null));

    //+ Act
    myViewModel.DoLookupCommand.Execute(0);

    //+ Assert
    myViewModel.IsSearchShowing.Should().BeFalse();
}

在我完成模拟的LookUpIdAsync之前,会调用我的断言.在我的普通代码中,这正是我想要的.但对于我的单元测试,我不想这样.

我正在从使用BackgroundWorker转换为Async/Await.对于后台工作人员,这项功能正常运行,因为我可以等待后台工作人员完成.

但似乎没有办法等待异步void方法...

How can I unit test this method?

推荐答案

我想出了一个单元测试的方法:

[TestMethod]
public void TestDoStuff()
{
    //+ Arrange
    myViewModel.IsSearchShowing = true;

    // container is my Unity container and it setup in the init method.
    container.Resolve<IOrderService>().Returns(orderService);
    orderService = Substitute.For<IOrderService>();

    var lookupTask = Task<IOrder>.Factory.StartNew(() =>
                                  {
                                      return new Order();
                                  });

    orderService.LookUpIdAsync(Arg.Any<long>()).Returns(lookupTask);

    //+ Act
    myViewModel.DoLookupCommand.Execute(0);
    lookupTask.Wait();

    //+ Assert
    myViewModel.IsSearchShowing.Should().BeFalse();
}

这里的关键是,因为我正在进行单元测试,所以我可以在任务中替换我想要返回的异步调用(在异步void中).然后,我只需确保任务已完成,然后再继续.

.net相关问答推荐

如何在AutoMapper中添加自定义方法到项目中?

信号量的多线程问题

我应该创建一个 DateRange 对象吗?

如何从控制台应用程序中的 Task.WaitAll() 获取返回值?

发布版本中的 Debug.WriteLine

防止对话框在按钮的单击事件处理程序中关闭

.Net 中的 Decimal.One、Decimal.Zero、Decimal.MinusOne 的用途是什么

String 是原始类型吗?

如何在 C# 中序列化异常对象?

Java 和 .NET 技术/框架的类似物

如何使用反射在 .NET 中调用重载方法

所有数组在 C# 中都实现了哪些接口?

检索字典值最佳实践

是否有 Linq 方法可以将单个项目添加到 IEnumerable

Iif 在 C# 中等效

错误 NU1605 检测到包降级

在 .Net 中调用 Web 服务时绕过无效的 SSL 证书错误

泛型类的默认构造函数的语法是什么?

/langversion 的错误选项6无效;必须是 ISO-1、ISO-2、3、4、5 或默认值

在 C#/.NET 中合并两个图像