2011-04-12 71 views
0

当引用我们使用委托其​​他类。在单元测试期间,我们重写这些值。C#中的数组引用

我有一个类,它比其他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; 
} 
+3

那么问题是什么?什么是错误? – 2011-04-12 18:32:48

+0

您是否考虑过在某些情况下使用接口而不是委托? – TrueWill 2011-04-12 18:43:31

+0

我们使用CSLA,因此所讨论的方法是静态的。 AIUI接口不能用静态方法实现,所以这种方法不是一种选择。 – sixeyes 2011-04-12 19:06:40

回答

2

而不是创建该处理器阵列,你可以做这样的事情:

private static IEnumerable<Func<int,bool>> GetHandlers() 
{ 
    yield return firstMethod; 
    yield return secondMethod; 
    yield return thirdMethod; 
} 

现在你有办法让现场实际引用,以便它们可以被替换为单元测试,也有一种方法可以遍历所有的处理程序。也就是说,可以替换的代理数组基本上是可以被覆盖的一个接口或一组抽象方法。如果你使用设计来提供它的语言特性来实现多态性,它可能会更清洁和更易于维护。为了在单元测试换出使用委托行为的方便,你可以像使用最小起订量嘲弄框架,以嘲弄的接口,而无需编写特定的测试类。

-Dan

+0

谢谢。这看起来就像我之后的事情。 – sixeyes 2011-04-12 19:02:17