[当然,问题不限于特定的“ friend ”实现,尽管如果相关,请随时指出实现细节]
阅读未回答的问题,我偶然发现了 InternalsVisibleTo
属性:
Specifies that types that are ordinarily visible only within the current assembly are visible to another assembly.
C# Programming Guide在 MSDN有一个部分 Friend Assemblies描述如何使用该属性以允许使用
internal
方法和类型到另一个程序集。我想知道使用它来创建一个“隐藏”接口(interface)来检测库以供单元测试程序集使用是否是一个好主意。它似乎在两个方向上大量增加了耦合(在生产程序集中测试代码,在测试代码中对生产程序集的内部了解),但另一方面,它可能有助于创建细粒度的测试,而不会弄乱公共(public)接口(interface)。
你在测试时使用友元声明是什么体验?是你的银弹,还是它开始了死亡行军?
最佳答案
我已经广泛使用了这种技术——这意味着我的单元测试可以测试代码库中普通消费者看不到的方面。
使用 [InternalsVisibleTo]
时确实增加了耦合,我相信(轻微的)增加是非常值得的。
我的单元测试已经与被测代码紧密耦合——尽管我尝试编写测试来确保特定的结果,而不是特定的实现,通过访问普通消费者不可见的东西,我确实在某种程度上限制了实现。
反过来说,耦合是最小的——拥有 [InternalsVisibleTo]
代码程序集上的属性,并将某些内容标记为 内部 而不是 私有(private) (或 内部 protected 而不是 protected )。
(请注意,我在这里忽略了使用单元测试引发的任何设计更改,这是另一个完整的讨论。)[InternalsVisibleTo]
属性需要强命名您的程序集。如果您还没有这样做,您可能会发现这有点繁琐,因为强命名程序集可能只依赖于其他强命名程序集,这最终可能导致您需要更改多个程序集。
获得正确的属性可能有点繁琐,因为它需要包含测试程序集的公钥。 IDesign有一个有用的Friend Assembly tool在剪贴板上创建属性,准备粘贴。受到推崇的。
关于.net - 使用 "friend"-declarations 进行单元测试。馊主意?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/261177/