以下方法应该如何进行单元测试?
/// <summary>
/// Entry point for GUI thread.
/// </summary>
public void VerifyDataTypesAsync()
{
Task verificationTask = Task.Factory.StartNew(() =>
{
VerifyDataManagerAsync();
});
}
是否只能通过集成测试进行测试,或者是否可以测试是否已创建任务?
感谢您的帮助
答案 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
方法。
有关模拟的更多信息,请查看RhinoMocks或Moq。