【发布时间】:2016-02-23 19:25:43
【问题描述】:
我有一个简单的类,方法如下:
partial class SimpleClass
{
private readonly ISimpleManager _simpleManager;
public SimpleClass(ISimpleManager simpleManager)
{
_simpleManager = simpleManager;
}
public async void SimpleMethod()
{
IsInProgress = true;
DoSomeWork();
Task<int> hardWork0Task = _simpleManager.DoHardWork0Async();
Task<int> hardWork1Task = _simpleManager.DoHardWork1Async();
DoIndependentWork();
int hardWork0Result = await hardWork0Task.ConfigureAwait(false);
DoDependentWork(hardWork0Result);
int hardWork1Result = await hardWork1Task.ConfigureAwait(false);
DoDependentWork(hardWork1Result);
IsInProgress = false;
}
}
假设属性IsInProgress 只是bool 属性通知GUI 其状态以允许刷新进度条。 DoSomeWork、DoDependentWork 和DoIndependentWork 是一些使用或不使用努力工作的结果的方法。
ISimpleManager 是在这种情况下你能想象到的最简单的界面:
interface ISimpleManager
{
Task<int> DoHardWork0Async();
Task<int> DoHardWork1Async();
}
我必须使用 Moq 和 NUnit 编写一些单元测试。我该如何为这种情况编写单元测试?我想检查在与 GUI 异步运行的整个代码期间,IsInProgress 属性的状态是否未更改为 false。是否有意义?可能吗?如果我的async 方法返回Task 或通用Task<T> 怎么办?如果我为true 配置等待会怎样?
【问题讨论】:
-
您可以使用存根使代码运行很长时间,然后您就可以捕获正在进行的状态。
-
拥有返回
void的异步方法是个坏主意。我建议删除IsInProgress属性并返回Task。 -
@Sergey Berezovskiy,好的,正如我所提到的,我不介意使用
Task或通用Task<T>而不是void。您能否向我展示仅针对Task返回方法的完整解决方案?这对我会有帮助。我还有其他问题。如果您正在为 Caliburn 视图模型开发测试,您有一些方法必须是async void,即绑定到按钮单击事件的操作。在这种情况下该怎么办?公开显示返回Task的方法,除了返回async void的方法?这对我来说听起来不太好,因为您正在将 sut 代码更改为可测试。 -
@Ilya Kogan,这是我很久以来的想法,但我的队友拒绝了。通过使用锁或类似的东西来管理它是最好的解决方案,因为它不会不必要地延迟测试处理时间。但是你可以把你的解决方案放在答案中。这可能是最好的。
-
为什么对我的问题投反对票?
标签: c# .net unit-testing asynchronous moq