【问题标题】:C# Unit Testing with Accessors - Constructors don't work使用访问器进行 C# 单元测试 - 构造函数不起作用
【发布时间】:2023-03-26 23:02:01
【问题描述】:

我必须为我的应用程序编写单元测试,但我遇到了问题。我正在使用 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);

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

【问题讨论】:

  • 您的“示例”不是有效代码,因此很难判断发生了什么。 (您的术语也不清楚 - 什么是“访问器类”?)
  • 那么您想进行单元测试但不能进行单元测试的原因是什么?

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


【解决方案1】:

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

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

  • 公共方法未正确测试,或
  • 私有方法无关紧要 - 它们不会影响对象的行为方式,因此不需要进行测试。

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

如果是这样,它可能表明:

  • 那些公共方法应该更小(做的事情更少,并且不会让您完全困惑于哪个私有方法可能是有罪的),另外
  • 一个好主意是当私有方法依赖于行为不端时抛出特定异常。然后,您针对这些异常测试公共方法。

【讨论】:

  • 我同意你的看法。单元测试应该是类的黑盒测试:无论你如何实现它(即私有成员),测试都会断言它的行为符合预期。您不希望仅仅因为您更改了 如何 实现它(私有成员)而行为没有改变而更改您的单元测试。行为是您要测试的。
【解决方案2】:

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

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

【讨论】:

  • @peter:我知道如何编写构造函数以及必须在哪里放置逻辑。他们写得对。在这里,我以这种方式编写它们以向您展示他们的论点。关于单元测试,它们在同一个解决方案中,但在不同的项目中,所以程序集不一样。我试图将其设为私有,但我仍然无法访问它们。因此,Accessor 类可以满足我的要求,我可以访问该类的所有组件,但它们的构造函数不接受我传递的参数...对不起我的英语:(
  • 如果您能解释一下访问器类的含义,我或许可以提供更多帮助。
  • @Virtlink 出于好奇,我在 Google 上搜索了一下,social.msdn.microsoft.com/Forums/en-US/vststest/thread/…When creating a unit test project VS created an accessor class to allow the unit tests to get at the private/protected members/methods of the class... 开头,所以我认为这就是他所说的。
  • 访问器类与原始类相同,但在创建测试时自动生成。访问器类拥有普通类所拥有的一切——属性、方法、WPF 控件(WrapPanel、网格、按钮等),并且可以访问私有和受保护的方法。是的,@Morawski 回答 :)
猜你喜欢
  • 2012-06-28
  • 2015-09-18
  • 2021-12-14
  • 1970-01-01
  • 2020-12-03
  • 1970-01-01
  • 1970-01-01
  • 2015-02-11
  • 1970-01-01
相关资源
最近更新 更多