1

我来自 Java,而且我对 C# 还很陌生,所以请多多包涵,以防我不使用正确的术语或者我正在考虑“java-ish”。

情况

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

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

问题

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

所以我有一种感觉,要么我的设计很糟糕,因为我完全误解了门面的东西(只有门面和它们的实现应该是可访问的,没有别的),我的项目设置有缺陷,或者还有其他问题。

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

4

1 回答 1

1

您可以使用InternalsVisibleToAttribute属性:

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

于 2012-04-28T14:33:17.700 回答