C# 隐藏类-但无法进行单元测试

C# 隐藏类-但无法进行单元测试,c#,oop,unit-testing,C#,Oop,Unit Testing,我正在使用Visual Studio 2010编写一个C#项目,但希望使用NUnit进行单元测试 我对oop很陌生,但我尝试了尽可能多地隐藏信息,只公开所需的最少接口。这意味着我有两个类,它们完全在库内部-它们可以处理一些内部状态,而用户只需要知道两个提供接口的公共类 这似乎尽可能地隐藏,为用户提供了一个最小的界面 然而,如果我想进行单元测试,我看不到测试这些类的方法。所以我的问题是什么是最佳实践?仅仅为了单元测试而不得不公开它们似乎是一种耻辱。。还是有更好的工作工具 这似乎是在尽可能多地封装和

我正在使用Visual Studio 2010编写一个C#项目,但希望使用NUnit进行单元测试

我对oop很陌生,但我尝试了尽可能多地隐藏信息,只公开所需的最少接口。这意味着我有两个类,它们完全在库内部-它们可以处理一些内部状态,而用户只需要知道两个提供接口的公共类

这似乎尽可能地隐藏,为用户提供了一个最小的界面

然而,如果我想进行单元测试,我看不到测试这些类的方法。所以我的问题是什么是最佳实践?仅仅为了单元测试而不得不公开它们似乎是一种耻辱。。还是有更好的工作工具

这似乎是在尽可能多地封装和尽可能多地公开方法以允许对它们进行测试之间的一种折衷——当然,单元测试最好测试内部工作并让集成测试测试公共接口

--


我意识到,通常情况下,您只会担心对公共接口进行单元测试,但在这种情况下,这将导致许多非常复杂的测试-最好将所有内容分解成小块进行测试?

我不会讨论测试内部类是否有意义,但您想要的可以通过使用属性来实现

将以下内容添加到您的库中:

[assembly:InternalsVisibleTo("MyTest")]
所有的内部类都可以从
MyTest.dll

中访问,也许我误解了您的情况,或者误解了单元测试的内容。带着一丝怀疑阅读。另外,请给我一些建议,告诉我确切的问题是什么

测试API绝不是单元测试——它被称为

单元测试一次对一个单元(例如一个类)进行测试,并对其环境进行建模。然后断言它的行为正常。对于您的私有类,“环境”是库的其余部分

私人数据不应为了测试而公开。这就是原因。私有数据是特定于实现的。也就是说,数据格式应该能够自由更改,而不会引起API类或单元测试用户的注意


比我解释得更好。

谢谢,这似乎是测试的良好开端。不过,如果有人对封装性和可测试性之间的平衡有任何反馈,我将非常感兴趣!我的0.02$:我有一种实用的测试方法——如果它足够复杂,可以从测试中受益,那么不管它是公共的还是内部的,我都会测试它。如果我以后更改它,我会更新/删除测试-我已经多次更改/删除了公共类,所以我不认为该参数有效。在我看来,通过公共API测试并不是单元测试(正如@Vorac在他的回答中正确指出的),但撇开这个问题不谈,我更喜欢让测试尽可能靠近UUT,以简化设置代码并避免由于其他组件被破坏而导致误报。感谢您的确认。这就是我的想法。这正是我的想法——黑盒测试(只有公共部分)比单元测试更接近系统测试,单元测试应该测试内部工作(白盒)。这是我的问题,直到有人解释说可以使用
InternalsVisibleTo
属性测试内部。然而,这个站点上的许多人和其他人似乎仍然认为不应该将这些私有部分暴露在单元测试中。