【问题标题】:How to unit testing a method which creates a task如何对创建任务的方法进行单元测试
【发布时间】:2012-07-26 10:38:21
【问题描述】:

下面的方法应该如何进行单元测试?

    /// <summary>
    /// Entry point for GUI thread.
    /// </summary>
    public void VerifyDataTypesAsync()
    {
        Task verificationTask = Task.Factory.StartNew(() =>
        {
            VerifyDataManagerAsync();
        });
    }

是否只能通过集成测试进行测试,或者是否可以测试已创建任务?

感谢您的帮助

【问题讨论】:

  • 为什么不返回任务?然后你可以在上面Wait(),或者做任何你想做的事情。
  • 因为我需要 UI 线程才能更新进度条

标签: c# unit-testing c#-4.0 task


【解决方案1】:

您可以创建一个工厂来创建此任务并通过接缝使用它。您可以使用属性接缝 - 这是当您将工厂的实例设置为被测类的属性时,或者您可以通过构造函数为工厂提供构造函数接缝。然后你可以模拟这个工厂并通过两个接缝之一设置它,并检查你的 VerifyDataTypesAsync 方法是否调用了创建任务的方法。

class YourClass
{
    public YourClass(ITaskFactory factory)
    {}

    public void VerifyDataTypesAsync()
    {
       Task verificationTask = factory.Create(); // you can pass an instance of a delegate as parameter if you need.  
    }
}

class TasksFactory : IFactory
{
   public Task Create()
   {

   }
}

然后在您的测试中,您可以创建一个 IFactory 的模拟对象并将其传递给您的类的构造函数,然后为模拟设置模拟规则以检查方法 Create 是否被调用。

如果我们谈论的是 NUnit 和 RhinoMocks,可以看看这个:

var mockRepository = new MockRepository();
var mockObject = mockRepository.CreateMock<IFactory>();
var yourClass = new YourClass(mockObject);    


Expect.Call(mockObject.Create);

mockRepository.ReplayAll();

mockObject.VerifyDataTypesAsync()

mockRepository.VerifyAll(); // throw Exception if your VerifyDataTypesAsync method doesn't call Create method of IFactory mock

粗略地说是这样……但这只是一种方式……

【讨论】:

    【解决方案2】:

    您可以将任务的创建包装在您自己的任务工厂类中,并通过在单元测试中模拟它来验证它是否已正确使用。例如,创建一个这样的类:

    class MyTaskFactory
    {
      public virtual void CreateTask(Action a)
      {
        Task.Factory.StartNew(a);
      }
    }
    

    您为需要创建任务的对象提供这些工厂对象之一。在单元测试中,您提供一个模拟版本而不是实际工厂,并查看是否已调用 CreateTask 方法。

    有关模拟的更多信息,请查看RhinoMocksMoq

    【讨论】:

    • 感谢您的回复。我在这方面还是有点新,所以你能扩展一下你所说的包装是什么意思吗?
    猜你喜欢
    • 2012-08-18
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 2020-05-21
    • 2014-02-14
    • 2021-07-29
    • 1970-01-01
    相关资源
    最近更新 更多