.net - 使用 "friend"-declarations 进行单元测试。馊主意?

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

[当然,问题不限于特定的“ friend ”实现,尽管如果相关,请随时指出实现细节]

阅读未回答的问题,我偶然发现了 InternalsVisibleTo 属性:

Specifies that types that are ordinarily visible only within the current assembly are visible to another assembly.



C# Programming GuideMSDN有一个部分 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/

相关文章:

.net - PCL "profile 111"- 如何在 TFS 构建服务器上安装?

.net - 支持每个单元测试类超时吗?

language-agnostic - OOP:在哪里停止抽象

language-agnostic - 是否存在开源分布式日志库?

c# - .NET Core 中的 Crossgen 编译

c# - 在 C# 中使用 .NET 3.5 将数据集转换为 JSON

c# - .Net ThreadPool 线程是如何创建的?

android - Android 的 ActivityUnitTestCase 中的测试对话框

unit-testing - Nunit 并行运行测试不起作用

c# - 聪明的算法找到数字总和等于数字显示中的段数的时间