关于私人方法的单元测试的问题

时间:2012-03-23 09:52:13

标签: .net unit-testing nunit mstest

在MSTest中,[Shadowing]属性可帮助您从另一个程序集中对单个方法进行单元测试。以下是相关链接:What is the Shadowing attribute that the VS uses when it generates unit tests?

我的问题是:

  1. 私人方法应该单独进行单元测试吗?
  2. 将私有方法的访问者更改为internal只是为了使其可用于某些其他测试项目/程序集中的单元测试,这是一种很好的(?)实践吗? (使用InternalsVisibleTo
  3. 如果私有方法通过调用它们的公共方法间接测试,它可以被称为“单元”测试吗?

4 个答案:

答案 0 :(得分:4)

  1. 不,不应该测试私有方法。您的应用程序仅与公共API交互。因此,您应该测试您的类的预期行为以进行此交互。私有方法是内部逻辑实现的一部分。你班上的用户不应该关心它是如何实现的。
  2. 不,这不好。往上看。您应该只测试公共API。
  3. 您应该只测试公共方法。您不关心公共方法是否会调用私有方法,或者在测试通过之前不会。如果测试失败,请修复实现。但不管怎么说都不测试私人方法。
  4. 更新(如何定义要测试的内容): 理想情况下(在测试优先方法中)测试是您班级的第一个用户。当您编写测试时,您会尝试想象用户将如何使用您的课程。用户不会与私人方法交互(反思是作弊)。因此,作为班级的第一个用户,您的测试不应与私有方法进行交互。

答案 1 :(得分:2)

简要回答您的问题:

  1. 一般来说,他们不应该。大多数情况下,您的私有位将在测试类合同/公共API时进行测试。对于时间这是不可能的,测试私有方法就像其他任何单元测试一样。

  2. 这很常见。虽然改变可见性可能被认为是坏主意,但当它仅仅改变为内部时,它并没有那么糟糕。然而,在像TDD这样的方法中,测试的需要通常会以这样的方式驱动你的设计,以至于不需要这样的“黑客”。但就像我说的那样,这是相当普遍的 - 你不应该过多担心它,除非它达到荒谬的程度(比如暴露的整个私人部分)。

  3. 只要它测试你班级的单个单元(或one logical concept),它就是单元测试。私有方法通常被创建为公共部分中的重构结果,大多数情况下,这些结构将由单个单元测试作为目标。如果您认为私有方法不再是单元,则可能是重构调用。

  4. 此外,我建议您查看hereherehere

答案 2 :(得分:1)

我希望通过公共可用的电话来练习所有私人方法。必须有一条路径来执行公共呼叫中的每条专线,如果不存在,则可以删除该代码。

使用内部而不是私有可能会以一团糟的方式结束,我不会使用这种方法。

答案 3 :(得分:0)

作为Java开发人员,我这样做。我也没有改变访问级别。我使用反射来访问私有方法。我不必将它授予我的用户,我也不必向他们展示我的单元测试。

这是Java的一个肮脏秘密:您始终可以通过反射来规避访问限制。我不知道C#和.NET是否也是如此,但您可以查看它。