在单元测试时你如何等待任务?

yes*_*man 1 c#

在C#测试项目中,我有这个测试:

[TestMethod]
public void TestIfListFilled()
{
    // arrange
    byte stuffTypeID = 0;
    List<Stuff> locationList = null;

    // act
    locationList = GetStuffListAsync(stuffTypeID);

    // assert
    Assert.IsTrue(locationList.Count > 0);
}
Run Code Online (Sandbox Code Playgroud)

并且该GetStuffListAsync方法具有以下签名:

Task<List<Stuff>> GetStuffListAsync(Byte stuffTypeID)
Run Code Online (Sandbox Code Playgroud)

现在,我的第一个猜测是await在我的测试方法中添加一个方法调用之前.但是,我无法添加async到我的testmethod的签名,或者Visual Studio将开始抱怨.在执行断言之前,我该怎么做才能填充列表?

Jon*_*eet 7

您也可以进行单元测试async:

[TestMethod]
public async Task TestIfListFilled()
{
    // arrange
    byte stuffTypeID = 0;

    // act
    List<Stuff> locationList = await GetStuffListAsync(stuffTypeID );

    // assert
    Assert.IsTrue(locationList.Count > 0);
}
Run Code Online (Sandbox Code Playgroud)

请注意,使用Result相反可能会导致死锁,具体取决于测试运行器设置的同步上下文; 你可能最终得到异步方法的延续等待回到正在等待异步方法完成的线程.

请注意返回类型的更改为Task- 单元测试运行器可以使用它来以比替代方式更清晰的方式检测完成,并且如果您尝试在测试中运行测试,则确保测试将中断很有用不支持async测试的跑步者.

如果您想要更好地控制底层异步操作的工作方式,可以安装自己的同步上下文并创建任务(由依赖假货返回),这些任务只有在您适当步骤后才能完成.它变得非常复杂,但它是可行的 - 我在某处有一些示例代码,但不方便...