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

本文关键字:单元测试 同步方法 任务 调用 代码 | 更新日期: 2023-09-27 17:56:52

给定以下类:

public class TestAttribute : ActionFilterAttribute
{
    public bool SomeExampleBool = false;
    public override void OnActionExecuting(HttpActionContext actionContext)
    {
        Task.Factory.StartNew(() => { SomeExampleBool = true; });
    }
}

您将如何为断言SomeExampleBool等于true OnActionExecuting编写有效的单元测试?

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

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

您需要将

StartNew返回的Task公开给希望能够执行以下操作的任何人:

  1. 了解操作何时完成(通过向其添加延续)
  2. 知道结果是什么(如果适用)
  3. 了解任何例外情况(如果适用)
  4. 知道它是否已被取消
  5. 等到它完成

由于您没有将返回Task暴露给任何人,因此您只是将其放在地板上,因此其他人无法等待它,或者在完成后运行延续。 通常,您将从该方法返回Task。 如果不能,因为它是一个事件处理程序,那么你可能会将Task存储在调用方能够访问的字段或其他形式的状态中。

Task.Factory.StartNew将返回Task的实例。 如果调用 task.Wait() ,则可以保证任务将在执行下一行之前完成。 您应该能够只Wait任务完成,然后运行断言。