c# - 使用代码调用任务进行单元测试同步方法

标签 c# .net multithreading unit-testing

给定以下类(class):

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

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

如何为 OnActionExecuting 编写一个有效的单元测试来断言 SomeExampleBool 等于 true

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

最佳答案

您需要将 StartNew 返回的 Task 公开给您希望能够执行的任何人:

  1. 了解操作何时完成(通过向其添加延续)
  2. 了解结果(如果适用)
  3. 了解任何异常(exception)情况(如果适用)
  4. 了解是否已取消
  5. 等待完成

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

关于c# - 使用代码调用任务进行单元测试同步方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30899546/

相关文章:

c# - 使用带有异步方法的 SourceLink V2 调试。是否可以?

c# - 使用反射获取方法描述

c++ - 如何以线程安全的方式遍历二叉树?

ios - 如何计算 iOS 中的事件线程数

c# - 将 If 替换为循环

c# - 如何在 IE9 中使用 MSHTML 的 addEventListener 添加事件监听器?

c# - Azure AD 的 Web API 授权属性返回 401 Unauthorized for daemon app

.net - 为什么 .NET Sql Server 访问速度比 Excel Interop 快?

.net - 为什么.NET 中没有 RAII?

c# - 无法使用线程写入文件