【发布时间】:2015-10-16 22:50:42
【问题描述】:
我有一个异步函数说 DoWork() 它做一些工作并将结果存储在一个文件中。所以返回类型是无效的。我需要为此功能编写一个单元测试,这就是我的问题。
internal sealed class MainClass: InheritedClass
{
public override async void Start()
{
base.Start();
var result = await TaskEx.Run(() => DoSomeWork());
Store(result);
}
}
在单元测试类中,如果我有类似下面的代码,它不会等待,它会移动到下一行执行,但测试失败。那么,我怎样才能让它等待,直到基本操作完成。
public async Task StoreDataTest()
{
var t = Task.Factory.StartNew(MainClass.Start);
t.Wait();
var data = UtilityClass.GetStoredData();
Assert.IsNotNull(data, "No data found");
}
重写 Start() 时,我无法更改返回类型。在我的情况下,基类在许多地方被继承,并且在基类中更改虚拟方法的返回类型不是一种选择。那么我应该开始使用后台工作者和事件处理程序吗?我应该使用这种方法吗?
我们不能使用 .NET 4.5,因为我们仍然支持 XP :( 所以,我在 .net 4.0 上使用 BCL 库来获得异步和等待功能。最近,我看到一些博客建议不要使用 backgroundworker,因为它在以后的 .NET 版本中过时了?
List<EntityClass> result = null;
var worker = new BackgroundWorker();
worker.DoWork += (sender, e) =>
{
result = GetData();
};
worker.RunWorkerCompleted += (sender, eventArgs) =>
{
if (result == null)
{
return;
}
Store(result);
// Event used for Unit testing purpose
if (DataStoredEvent != null)
{
DataStoredEvent(this, new EventArgs());
}
};
worker.RunWorkerAsync();
谢谢
【问题讨论】:
-
我明白你的问题 - 你有一个
async void方法 :) 只要确保该方法返回Task,你会没事的(它给你一些东西到await/@987654328 @)。 -
Avoid async void,你没有办法等待它完成。
-
I have a async function say DoWork() which does some work and stores the result in a file. So the return type is void.后者实际上并非源自前者。您有一个函数可以完成某些工作并将结果存储在文件中这一事实意味着返回类型应该不是void,除非它是一个同步函数。 -
重写 Start() 时无法更改返回类型。在我的情况下,基类在许多地方被继承,并且在基类中更改虚拟方法的返回类型不是一种选择。那么我应该开始使用后台工作者和事件处理程序吗?
标签: c# .net unit-testing asynchronous async-await