使用访问器进行C#单元测试 - 构造函数不起作用

时间:2012-05-19 11:02:20

标签: c# .net wpf unit-testing accessor

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

我的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);

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

2 个答案:

答案 0 :(得分:5)

如果你必须对私有方法进行单元测试,那么开始时类设计是不是很糟糕?我(有点虚弱,我承认)理解是“外部世界”不应该关心对象的私有方法 - 只是它是否正确地写在框中。私有方法不是“合同”的一部分 - 它们的实现,返回类型等都可以改变,公共API是重要的。

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

  • 公开方法未经过正确测试,或
  • 私有方法并不重要 - 它们不会影响对象的行为方式,因此不需要进行测试。

或者它是不可能的,但你想测试私有方法以确定哪一个导致某些公共方法出乎意料地行为?

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

  • 那些公共方法应该更小(做得更少,并且由于这不会让你完全不知道哪种私人方法可能有罪),再加上
  • 一个好主意是当他们依赖的私有方法行为异常时抛出特定的异常。然后,您测试那些例外的公共方法。

答案 1 :(得分:4)

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

我希望我能正确理解你的问题,因为你使用了不明确的术语(访问者类)。请解释或询问您是否想了解更多。