gpt4 book ai didi

c# - 如何使用 TPL 和 TaskScheduler 编写单元测试

转载 作者:IT王子 更新时间:2023-10-29 04:49:02 31 4
gpt4 key购买 nike

想象这样一个函数:

private static ConcurrentList<object> list = new ConcurrentList<object>();
public void Add(object x)
{
Task.Factory.StartNew(() =>
{
list.Add(x);
}
}

我不关心什么时候 fentry 被添加到列表中,但我需要它被添加到最后(显然 ;))

我看不出有什么方法可以在不返回任何回调处理程序或其他东西的情况下正确地对这样的东西进行单元测试。并因此添加程序不需要的逻辑

你会怎么做?

最佳答案

实现此目的的一种方法是使您的类型可配置,以便它采用 TaskScheduler 实例。

public MyCollection(TaskScheduler scheduler) {
this.taskFactory = new TaskFactory(scheduler);
}

public void Add(object x) {
taskFactory.StartNew(() => {
list.Add(x);
});
}

现在在您的单元测试中,您可以做的是创建 TaskScheduler 的可测试版本。这是一个抽象类,被设计为可配置的。简单的计划功能将项目添加到队列中,然后添加一个功能来“现在”手动执行所有队列项目。然后你的单元测试看起来像这样

var scheduler = new TestableScheduler();
var collection = new MyCollection(scehduler);
collection.Add(42);
scheduler.RunAll();
Assert.IsTrue(collection.Contains(42));

TestableScehduler 的示例实现

class TestableScheduler : TaskScheduler {
private Queue<Task> m_taskQueue = new Queue<Task>();

protected override IEnumerable<Task> GetScheduledTasks() {
return m_taskQueue;
}

protected override void QueueTask(Task task) {
m_taskQueue.Enqueue(task);
}

protected override bool TryExecuteTaskInline(Task task, bool taskWasPreviouslyQueued) {
task.RunSynchronously();
}

public void RunAll() {
while (m_taskQueue.Count > 0) {
m_taskQueue.Dequeue().RunSynchronously();
}
}
}

关于c# - 如何使用 TPL 和 TaskScheduler 编写单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7852960/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com