【问题标题】:Should unit tests be written for private methods in event-driven code?是否应该为事件驱动代码中的私有方法编写单元测试?
【发布时间】:2016-02-14 18:58:52
【问题描述】:

我正在使用 C# 编写我的第一个 Windows 窗体程序。它由 3 个类组成,每种形式一个。除了构造函数之外,每个类中的所有方法都是私有的。

在试图弄清楚如何为方法编写单元测试时,我发现一些帖子和文章说不应该对私有方法进行单元测试,因为私有方法是一种实现,而不是公共行为.

我想我理解这种推理,但这似乎意味着我的 NONE 代码将为其编写单元测试。一切都是事件驱动的,发生在单击按钮、在字段中输入值或计时器滴答时。

正确吗?我的代码应该根本没有单元测试吗? (如果这是另一个问题的重复,我深表歉意。我查看了,但找不到解决此问题的任何内容。)

【问题讨论】:

  • 一些代码可以帮助您更好地了解您正在使用的示例。一般来说,私有方法仍然会有返回值,或者至少对数据或状态有影响,而这本身可以被测试。

标签: c# unit-testing


【解决方案1】:

确实,私有方法是应用程序的私有实现,不应对其进行单元测试。大多数时候,它们将通过公共方法在内部调用。通过测试公共方法,您就是在测试那些私有方法。

正如您所说,您的私有方法是事件驱动的,当用户单击按钮等时将执行该方法...如果您认为您的事件处理程序包含很多应该测试的逻辑,那么我建议您按照以下步骤操作:

  1. 使用internal 修饰符标记所有包含您的事件处理程序的类(表单)。使用此修饰符,这些类只能在定义它们的同一程序集中访问。
  2. 您还需要使用public 修饰符标记所有事件处理程序方法。因为第 1 步中的类是 internal,所以这些方法仅对定义它们的程序集可见,然后仅在您的 Windows 窗体项目中可见。
  3. 在您的 Windows 窗体项目的 AssemblyInfo.cs 文件中添加此属性:[assembly: InternalsVisibleTo("MyTestAssemblyName")] 其中 MyTestAssemblyName 是您的测试项目的程序集名称。
  4. 通过执行第 3 步,您的所有内部类因此事件处理程序对您的测试项目也是可见的。在这一步并将您的 Windows Formsq 项目引用到您的测试项目,然后您可以对您的事件处理程序进行单元测试,就像您对每个方法所做的那样。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-24
    • 1970-01-01
    • 2021-08-08
    • 2011-09-06
    • 1970-01-01
    • 2011-08-01
    • 2013-05-25
    • 2013-06-02
    相关资源
    最近更新 更多