外墙包装设计

时间:2012-04-28 13:35:12

标签: c# oop unit-testing

我来自Java,而且我对C#很新,所以如果我没有使用正确的术语或者我正在考虑“java-ish”,请耐心等待。

情况

我正在处理一个包(同一命名空间中的所有类),它提供了从几个远程服务中使用数据的外观。对于每个门面,都有一个接口(如IEventServiceGateway)和一个实现(如EventServiceGateway),都声明为public。这些实现中的每一个都消耗来自至少一个服务的数据,所有这些都有点冗长,因此我为每个服务编写了一个客户端类(如UserServiceClient),为所有实现提供了通用操作。因为包外的任何人都不应该使用它们,所以我宣称它们为internal。此外,我对WCF代理做了同样的事情。

我有两个程序集,一个用于外观和客户端,一个用于单元测试,两者的命名空间是相同的。

问题

  • 我无法对内部类进行单元测试,因为在包含单元测试的程序集中无法访问它们。我知道有一些“黑客”来规避这些限制,但使用这些黑客通常意味着我使用的东西不是假设的。不测试客户端似乎不是一个明智的解决方案,因为在测试外墙时代码路径会很复杂。此外,我会一遍又一遍地测试边缘情况。
  • 我无法使用构造函数注入将内部类注入到外观中,因为参数的可见性比构造函数的可见性“低”。但是,WCF代理的硬编码会降低可测试性。

所以我觉得我的设计要么被堵塞了,因为我完全误解了外墙的东西(只有外墙及其实施应该是可以访问的,没有别的),我的项目设置有缺陷或其他东西是错。

如果有人能够启发我,我将不胜感激。

1 个答案:

答案 0 :(得分:1)

您可以使用InternalsVisibleToAttribute属性:

当您将其添加到内部的程序集时,您可以指定其他可以具有通常无法访问的程序集。