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

时间:2014-11-21 13:20:03

标签: c#

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

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

    // act
    locationList = GetStuffListAsync(stuffTypeID);

    // assert
    Assert.IsTrue(locationList.Count > 0);
}

GetStuffListAsync方法有这个签名:

Task<List<Stuff>> GetStuffListAsync(Byte stuffTypeID)

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

1 个答案:

答案 0 :(得分:7)

您也可以进行单元测试async

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

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

    // assert
    Assert.IsTrue(locationList.Count > 0);
}

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

请注意将返回类型更改为Task - 单元测试运行器可以使用它来以比其他方式更清晰的方式检测完成情况,并且它如果您尝试在不支持async测试的测试运行器中运行测试,那么确保测试会中断是有用的。

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