Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 使用;“朋友”-单元测试的声明。坏主意?_.net_Unit Testing_Language Agnostic_Friend_Internalsvisibleto - Fatal编程技术网

.net 使用;“朋友”-单元测试的声明。坏主意?

.net 使用;“朋友”-单元测试的声明。坏主意?,.net,unit-testing,language-agnostic,friend,internalsvisibleto,.net,Unit Testing,Language Agnostic,Friend,Internalsvisibleto,[当然,这个问题并不局限于特定的“朋友”实现,但如果相关,请随时指出实现细节] 通过阅读未回答的问题,我偶然发现了以下属性: 指定要删除的类型 通常仅在内部可见 当前程序集对用户可见 另一个大会 on有一节描述了如何使用属性来允许对另一个程序集使用internal方法和类型 我想知道使用它来创建一个“隐藏”接口,用于检测库以供单元测试程序集使用是否是一个好主意。它似乎在两个方向上都大量增加了耦合(在生产程序集中测试代码,在测试代码中熟悉生产程序集的内部知识),但另一方面,它可能有助于创建细粒度测

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

通过阅读未回答的问题,我偶然发现了以下属性:

指定要删除的类型 通常仅在内部可见 当前程序集对用户可见 另一个大会

on有一节描述了如何使用属性来允许对另一个程序集使用
internal
方法和类型

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


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

这是我个人应用于
InternalsVisibleTo
的唯一一个用法,而且确实非常非常方便


我不认为单元测试是黑盒测试——它们在某种程度上已经与实现耦合在一起了。能够测试内部类型和方法可以更紧密地关注(更小的单元)。

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

虽然使用
[InternalsVisibleTo]
确实会增加耦合,但我相信(较小的)增加是值得的

我的单元测试已经与被测代码紧密耦合——尽管我试图通过访问普通消费者看不到的东西来编写确保特定结果而不是特定实现的测试,但我确实在一定程度上限制了实现

另一方面,耦合是最小的-在代码程序集上具有
[InternalsVisibleTo]
属性,并且在将某些东西标记为internal而不是private(或者protected internal而不是protected

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

[InternalsVisibleTo]
属性要求对程序集进行强命名。如果您还没有这样做,您可能会发现这有点麻烦,因为强名称程序集可能只依赖于其他强名称程序集,这可能会导致您需要更改多个程序集


获取正确的属性可能有点麻烦,因为它需要包含测试程序集的公钥。IDesign有一个有用的工具,可以在剪贴板上创建属性,以便粘贴。推荐。

我认为使用
内部属性
来实现单元测试是完全合理的。我在“单元测试”中的“单元”是一个类,它包括
内部
类,所以我想测试它们,不过

我不认为仅仅为测试创建一个特殊的私有接口是一个好主意。单元测试的价值之一是,它让您有机会从类的使用者的角度考虑类的接口;提供一个后门会剥夺这种好处


然而,我的偏好是将单元测试与生产代码放在同一个程序集中。它通常不会影响我的客户,但它确实为我简化了事情,所以我就这么做了。当我这样做的时候,它会让
内部可视属性问题消失。

事实上,单元测试是我唯一能够让自己使用
内部可视属性的方法。有了它,您可以将“私有”方法的很大一部分实现为内部方法,而不是将它们公开给单元测试框架,以便对类内部不变量进行更具侵入性的测试


我在这项技术上取得了巨大的成功。如果没有别的方法,它可以帮助您通过在不可访问的情况下调用私有方法来实现神话100%代码覆盖目标。

< P>我认为当将新的C++代码与传统的C +代码结合在一起时,使用单独的程序集时会出现另一个合法的用例。

我们已经将C++程序集转换为C++/CLI,然后在C语言中实现新的代码。当我们这样做时,我们仍然会对C#中并非真正公开的类/方法使用“internal”,然后将它们作为友元程序集提供给遗留代码。

感谢关于强命名的提示!我(还)没有意识到这一点,但由于我认为我的所有程序集都必须为发行版命名,我并不认为这是一个真正的问题。