代码之家  ›  专栏  ›  技术社区  ›  Chubsdad

模拟异步任务

  •  10
  • Chubsdad  · 技术社区  · 10 年前

    我在使用Moq在.NET 4.0上使用Microsoft BCL进行的单元测试中遇到了以下情况

    Task<MyClass> mockTask = new Task<MyClass>(() => new MyClass());
    
    uploadHelper.Setup().Returns(mockTask);
    
    Task.WaitAll(mockTask);
    

    我面临的问题是Task.WaitAll(mockTask)只是阻塞而从不返回。

    我在这里做错了什么?

    编辑 注意,mockTask在我的上下文中是异步的。

    3 回复  |  直到 10 年前
        1
  •  15
  •   Olivier    10 年前

    您的任务尚未启动!

    只需使用:

     Task<MyClass> mockTask = Task.FromResult(new MyClass());
    

    或者,也可以这样做:

    Task<MyClass> mockTask = new Task<MyClass>(() => new MyClass());
    mockTask.Start();
    
        2
  •  3
  •   mark    10 年前

    提出的解决方案有一个问题——任务可能会结束 Returns 被调用。 这意味着您的单元测试呈现出与真实代码不同的异步语义。这就是你想要的吗?

    如果您真的想要捕获测试代码的异步特性,则不能使用 退换商品 方法。

    而是使用接受函数的Returns重载。类似于:

    uploadHelper.Setup().Returns(() => Task.Run(() => new MyClass()));
    

    这样您就可以确定使用异步执行路径。

        3
  •  -1
  •   Colin Bacon    10 年前

    我使用

    Task.Factory.StartNew(() => new MyClass());