Unit testing C语言中的任务包装器#
我正在使用WinForms(Unit testing C语言中的任务包装器#,unit-testing,asynchronous,c#-4.0,task-parallel-library,task,Unit Testing,Asynchronous,C# 4.0,Task Parallel Library,Task,我正在使用WinForms(.NET4.0)中的任务来执行诸如WCF调用之类的冗长操作。应用程序已经在大量使用任务的产品中(几乎所有使用任务的方法都是void) 在单元测试期间,我们使用了autorestevents(在实际代码中)来确定给定任务何时完成,然后执行断言 这让我想到几乎所有的AutoResetEvent都是浪费精力。他们只是在满足单元测试的需要,没有别的 当实际代码运行时,我们是否可以同样地围绕任务创建一个包装器。。。它们应该在后台工作,在单元测试的情况下,它们应该是同步的 类似于
.NET4.0
)中的任务来执行诸如WCF
调用之类的冗长操作。应用程序已经在大量使用任务的产品中(几乎所有使用任务的方法都是void
)
在单元测试期间,我们使用了autorestevent
s(在实际代码中)来确定给定任务何时完成,然后执行断言
这让我想到几乎所有的AutoResetEvent
都是浪费精力。他们只是在满足单元测试的需要,没有别的
当实际代码运行时,我们是否可以同样地围绕任务创建一个包装器。。。它们应该在后台工作,在单元测试的情况下,它们应该是同步的
类似于下面的BackgroundWorker
链接
为什么不能在包装器中简单地对任务使用continuation,如下所示:
var task = ...
task.ContinueWith(t => check task results here)
此外,如果他们有返回类型任务
,那么您可以在那里使用等待
,然后进行断言:
[Test]
public async Task SynchronizeTestWithRecurringOperationViaAwait()
{
var sut = new SystemUnderTest();
// Execute code to set up timer with 1 sec delay and interval.
var firstNotification = sut.StartRecurring();
// Wait that operation has finished two times.
var secondNotification = await firstNotification.GetNext();
await secondNotification.GetNext();
// Assert outcome.
Assert.AreEqual("Init Poll Poll", sut.Message);
}
另一种方法(来自同一篇文章)是使用自定义任务调度器,在单元测试的情况下,它将是同步的:
[Test]
public void TestCodeSynchronously()
{
var dts = new DeterministicTaskScheduler();
var sut = new SystemUnderTest(dts);
// Execute code to schedule first operation and return immediately.
sut.StartAsynchronousOperation();
// Execute all operations on the current thread.
dts.RunTasksUntilIdle();
// Assert outcome of the two operations.
Assert.AreEqual("Init Work1 Work2", sut.Message);
}
相同的MSDN杂志包含nice。另外,
async void
应仅用作事件处理程序,所有其他方法应具有async Task
签名。为什么不能对这些任务使用Wait()
来查找它们何时完成?方法早就用void编写好了。使用任务返回更新所有方法将是一项非常大的任务。我以为您已经想更新方法来删除AutoResetEvent
s并引入Task
包装器。我的建议怎么会更糟?就像我在问题中提到的。。。我使用的是.NET 4.0,因此无法使用异步和await@Abhash786您可以使用Microsoft.Bcl.Async
。尽管它确实需要C#5.0编译器。