2

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

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

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

谢谢你的帮助

4

2 回答 2

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 的模拟对象并将其传递给您的类的构造函数,然后为模拟设置模拟规则以检查方法 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

大致这样说……但这只是一种方式……

于 2012-07-26T11:39:40.940 回答
2

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

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

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

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

于 2012-07-26T11:08:53.670 回答