如何对创建任务的方法进行单元测试

时间:2012-07-26 10:38:22

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

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

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

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

感谢您的帮助

2 个答案:

答案 0 :(得分:3)

您可以创建工厂来创建此任务并通过接缝使用它。您可以使用属性接缝 - 当您将工厂的实例设置为测试类的属性时,或者您可以通过为工厂提供构造函数来使用构造函数接缝。然后你可以模拟这个工厂并通过两个接缝之一设置它并检查你的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的模拟对象并将其传递给类的构造函数,然后为mock设置模拟规则以检查是否调用了方法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

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

答案 1 :(得分:2)

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

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

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

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