Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何模拟异步任务列表来对函数进行单元测试_C#_Unit Testing_Async Await_Task_Moq - Fatal编程技术网

C# 如何模拟异步任务列表来对函数进行单元测试

C# 如何模拟异步任务列表来对函数进行单元测试,c#,unit-testing,async-await,task,moq,C#,Unit Testing,Async Await,Task,Moq,我有一个函数,它获取Task的列表,并返回一个int,指示在给定时间内有多少任务正在运行 public int GetActiveTasks(List<Task<SomeClass>> tasks) { return tasks.Count(x=> x.Status == TaskStatus.Created || x.Status == TaskStatus.

我有一个函数,它获取
Task
的列表,并返回一个
int
,指示在给定时间内有多少任务正在运行

 public int GetActiveTasks(List<Task<SomeClass>> tasks)
        {
            return tasks.Count(x=>
                x.Status == TaskStatus.Created ||
                x.Status == TaskStatus.Running ||
                x.Status == TaskStatus.WaitingForActivation ||
                x.Status == TaskStatus.WaitingToRun ||
                x.Status == TaskStatus.WaitingForChildrenToComplete);
        }
public int GetActiveTasks(列出任务)
{
返回任务。计数(x=>
x、 状态==任务状态。已创建||
x、 状态==任务状态。正在运行||
x、 状态==任务状态。等待激活||
x、 状态==TaskStatus.WaitingToRun||
x、 状态==任务状态。等待子女完成);
}
现在的问题是,我想围绕这一点编写一些单元测试,但是任务上的Status属性没有setter(这很有意义,为什么会有setter?)

因此,我的计划是创建一个任务列表,如下所示:

var taskList = new List<Task<SomeClass>>()
            {
                new Task<SomeClass>() { Status = TaskStatus.Running },
                new Task<SomeClass>() { Status = TaskStatus.Cancelled },
            };
var taskList=新列表()
{
新建任务(){Status=TaskStatus.Running},
新任务(){Status=TaskStatus.Cancelled},
};
然后将其传递到函数中,并检查整数输出是否符合我的预期

但是因为我不能明确地设置状态,我有点卡住了


有什么想法吗?

Task.FromResults
Task.FromException
Task.FromCancelled
Task.Delay()
为什么需要检查
等待状态?
任务。当所有的
可能返回一个等待孩子完成的任务时,说来话长,但是我们有一个业务需求,需要向第三方api发送大量数据,但它一次不能处理超过x个请求(比如5个)。所以我们需要发送100个请求,一批5个。我们可以在发送更多之前发送5并使用whenall(),这是低效的,因为有些可能需要20毫秒才能完成,有些可能需要20000毫秒。。。因此,我们会跟踪我们有多少任务以及它们的状态,我们会向api发送5个请求,当每个任务返回时,我们会发送另一个请求,因此,当我们的工作排队时,我们将始终有5个任务在进行中。您不需要检查任务状态,您需要一个
ActionBlock
,将
maxdegreeofpparallelism
设置为5。例如
var block=newactionblock(t=>someAction(t),newexecutiondataflowblockoptions{maxdegreeofpparallelism=5});foreach(消息中的var msg){block.Post(msg);}block.Complete();等待区块完成是。默认值是一次一个。并行性来自于在自己的线程上执行管道中的每个块。但是,没有什么可以阻止您将DOP增加到所需的程度