当引用其他类时,我们使用委托。在单元测试期间,我们覆盖这些值。
我有一个类引用了20多个其他类,所以我想我会创建一个委托数组。如果我创建这些委托的静态数组(请参阅下面的代码),它将存储委托的值,而不是对委托的引用。
因此,单元测试无法更新值。为了解决这个问题,我想在使用它们时创建了代理数组,但我希望下面的代码可以工作。
private static Func<int, bool> firstMethod = ExternalClass1.Method;
private static Func<int, bool> secondMethod = ExternalClass2.Method;
private static Func<int, bool> thirdMethod = ExternalClass3.Method;
private static Func<int, bool>[] handlers = { first, second, third };
public bool Test(int value)
{
foreach (var handler in handlers)
{
if (handler.Invoke(value) == true)
{
return true;
}
}
return false;
}
答案 0 :(得分:2)
您可以执行以下操作,而不是创建此处理程序数组:
private static IEnumerable<Func<int,bool>> GetHandlers()
{
yield return firstMethod;
yield return secondMethod;
yield return thirdMethod;
}
现在您可以获得实际的字段引用,以便可以替换单元测试,但也可以迭代所有处理程序。也就是说,可以替换的一组委托基本上是一个可以被覆盖的接口或一组抽象方法。如果使用旨在提供它的语言功能实现多态,则可能更清晰,更容易维护。为了方便在单元测试期间使用委托交换行为,您可以使用像Moq这样的模拟框架来模拟接口,而无需编写特定的测试类。
-Dan