使用代码调用任务的单元测试同步方法

时间:2015-06-17 18:29:16

标签: c# .net multithreading unit-testing

鉴于以下课程:

public class TestAttribute : ActionFilterAttribute
{
    public bool SomeExampleBool = false;

    public override void OnActionExecuting(HttpActionContext actionContext)
    {
        Task.Factory.StartNew(() => { SomeExampleBool = true; });
    }
}

您如何编写OnActionExecuting的有效单元测试,其中SomeExampleBool等于true

当编写单元测试并调用OnActionExecuting,然后调用Assert时,逻辑将在尚未执行的线程上执行。所以Assert失败了。你会尝试Thread.Sleep这样的事情几秒钟吗?看起来像一个黑客。我确信有一种更好的方式,我没有想到,但我正在向社区寻求帮助。

2 个答案:

答案 0 :(得分:3)

您需要将Task返回的StartNew公开给您想要的任何人:

  1. 知道操作何时结束(通过添加延续)
  2. 知道结果是什么(如果适用)
  3. 了解任何例外情况(如果适用)
  4. 知道是否被取消
  5. 等到它完成
  6. 由于您没有向任何人公开回复Task,您只是将其丢弃在地板上,其他任何人都无法等待,或者无法运行它完成后的继续。通常,您需要从该方法返回Task。如果你不能,因为它是一个事件处理程序,那么你可以将Task存储在一个字段或调用者能够访问的某种其他形式的状态中。

答案 1 :(得分:1)

Task.Factory.StartNew将返回Task的实例。如果您致电task.Wait(),您将确保在执行下一行之前完成任务。您应该能够Wait完成任务,然后在此之后运行您的断言。