如何在C#中创建用于测试目的的模拟Task对象?

时间:2016-11-15 20:22:38

标签: c# unit-testing asynchronous mocking task

我正在尝试编写一个必须模拟返回Task的异步方法的单元测试。

过去,我不得不模拟一个返回Task<T>的异步方法。为此,我可以使用Task.FromResult<T>(t),但我不认为它适用于Task。 (见这里:Stubbing Task returning method in async unit test

我发现似乎有效的一件事是Task.Delay(0),但这似乎相当骇人听闻。

在C#中为测试目的创建模拟Task对象的正确方法是什么?

我只需要Task表示任务已完成,但在将来的情况下,我可能需要一个Task来表示引发了异常或Task从未完成

3 个答案:

答案 0 :(得分:6)

由于Task<T>Task的子类型,您可以使用Task.FromResult,它应该可以正常工作:

Task fakeTask = Task.FromResult<object>(null);

另一种选择是使用Task.CompletedTask Property,它是为此目的而制作的:

Task completedTask = Task.CompletedTask;

答案 1 :(得分:0)

SomeUser的答案很好,但需要.net 4.6。由于我正在研究的项目是.net 4.5,我必须找到别的东西,而我发现的最好的事情是:

Task completedTask = Task.Delay(0);

答案 2 :(得分:-2)

测试单元测试中的异步方法

[TestMethod]
public async Task FunctionName_ActionTaken_ExpectedResult()
{
    await YourFunctionHere();
}

用于模拟访问任务中的结果

Task moqTask = Task.FromResult<object>(null);