0

我必须为我的应用程序编写单元测试,但我有一个问题。我正在使用 C# 和 .NET 4。在我的测试中,我无法访问类的私有属性和方法,所以我在单元测试中为每个类使用自动生成的访问器,但是......

我的 Accessor 类的构造函数不接受他们的参数。例子:

class SearchControl(bool isLogged, MainWindow mainWindow);
class MainWindow();

要创建SearchControl类型的对象,您需要传递 mainWindow 对象。因此,如果我使用非 Accessor 类进行此操作,我将无法访问私有方法和属性,也无法对其进行测试。

MainWindow mainWindow = new MainWindow();
SearchControl serchControl = new SearchControl(false, mainWindow);

我必须使用 Accessor clasees,但是当我这样做时,我的代码带有红色下划线,并且 Visual Studio 说不能接受参数。为什么,当我传递相同类型的参数时。如果我再次将MainClass对象传递给SearchControl_Accessor对象,我将无法访问 MainClass 中的属性。所以带有访问器的代码如下所示:

MainWindow_Accessor mainWindow = new MainWindiow_Accessor();
SearchControl_Accessor searchControl = new SearchControl_Accessor(false, mainWindow);

任何人都知道出了什么问题以及我必须做些什么来解决它。谢谢 :)

4

2 回答 2

5

如果您必须对私有方法进行单元测试,也许类设计一开始就不好?我(我承认有些微弱)的理解是“外部世界”不应该关心对象的私有方法 - 只关心它是否正确地写在盒子上。私有方法不是“合同”的一部分——它们的实现、返回类型等都可以改变,公共 API 才是最重要的。

在什么情况下你的对象的公共方法可以通过测试而私有方法失败?如果这是可能的,那么:

  • 公共方法没有经过适当的测试,或者
  • 私有方法无关紧要——它们不会影响对象的行为方式,因此不需要进行测试。

还是不可能,但是您想测试私有方法以确定哪个导致某些公共方法出现意外行为?

如果是这种情况,则可能表明:

  • 那些公共方法应该更小(做更少的事情,并且这不会让你完全困惑于哪个私有方法可能是有罪的),加上
  • 当私有方法依赖于行为不端时,一个好主意是抛出特定的异常。然后您测试这些异常的公共方法。
于 2012-05-19T11:50:05.383 回答
4

通常,您不能访问对象的私有属性、方法和字段。如果你真的需要访问它,你可以考虑制作它们internal(而不是private)。如果您的测试存在于另一个程序集中,请查看InternalsVisibleTo属性。该属性在正确应用到带有您要测试的代码的程序集时,允许您的带有测试的程序集访问您已标记的方法、字段和属性internal

我希望我正确理解了您的问题,因为您使用了不清楚的术语(访问器类)。请解释或询问您是否想了解更多信息。

于 2012-05-19T11:12:20.100 回答