.net - 使用“ friend ”声明进行单元测试。馊主意?

原文 标签 .net unit-testing language-agnostic friend internalsvisibleto

[当然,问题不限于特定的“朋友”实现,请随时指出相关的实现细节]

通读未解决的问题,我偶然发现了InternalsVisibleTo属性:


指定以下类型
通常仅在
当前装配对
另一个程序集。


C# Programming Guide上的MSDN有一个Friend Assemblies部分,描述了如何使用属性来允许将internal方法和类型用于另一个程序集。

我想知道使用它创建一个“隐藏的”接口,以检测用于单元测试程序集的库是否是一个好主意。它似乎在两个方向上都大量增加了耦合(生产程序集中的测试代码,测试代码中对生产程序集的深入内部知识),但是另一方面,它可能有助于创建细粒度的测试而不会弄乱公共接口。

您在测试时使用朋友声明的经验是什么?是您的银弹,还是开始了死亡游行?

最佳答案

我已经广泛使用了这种技术-这意味着我的单元测试可以测试普通用户看不见的代码库方面。

虽然使用[InternalsVisibleTo]确实会增加耦合,但我相信(轻微)增加非常值得。

我的单元测试已经与要测试的代码紧密结合-尽管我尝试编写测试以通过访问常规用户不可见的内容来确保特定的结果而非特定的实现,但是在一定程度上限制了实现。

换句话说,耦合是最小的-在代码汇编上具有[InternalsVisibleTo]属性,并将某些内容标记为内部而不是私有(或受保护的内部而不是受保护的)。

(请注意,我在这里忽略了由于使用单元测试而引起的任何设计更改,这是一个完整的讨论。)

[InternalsVisibleTo]属性要求对程序集进行强命名。如果尚未执行此操作,则可能会觉得有点麻烦,因为强命名程序集可能仅依赖于其他强命名程序集,最终可能需要更改多个程序集。

正确设置属性可能有点麻烦,因为它需要包含测试程序集的公钥。 IDesign有一个有用的Friend Assembly tool,可在剪贴板上创建该属性,准备粘贴。推荐的。

相关文章:

javascript - 如何使用嵌套函数(javascript,jasmine)为第三方库编写模拟

c++ - 限制由不确定行为引起的混乱?

.net - 在ASP.Net MVC View 中使用OnLoad事件的替代方法?

c# - 重载==运算符为null

java - selenium.waitForPageToLoad(“3000”)在3000毫秒后超时

java - 如何验证JUnit测试中引发的异常的详细信息?

algorithm - 如何最好地总结很多浮点数?

regex - 2d中的正则表达式有什么好/有趣的类似物吗?

c# - Excel Interop:退出Excel应用程序实例会使我的测试失败吗?

c# - LINQ to SQL关联映射