【问题标题】:C# test private static method of public static classC#测试公共静态类的私有静态方法
【发布时间】:2016-05-11 12:52:38
【问题描述】:

我对如何执行这些测试有点困惑。我知道有PrivateObject 来测试私有类和PrivateType 来测试私有静态类,但是如何测试公共静态类的私有静态方法呢?

public static class Clients {
    // CUT
    private static List<string> GenerateAddresses(string AppPath) {
        // CUT
    }
}

在我的单元测试课中我尝试过

PrivateType testClients = new PrivateType(Clients);

但我得到了错误

'Clients' 是一种类型,在给定的上下文中无效

这个错误有点令人困惑,谷歌给我带来了完全不同的问题。我在PrivateType 中使用了错误的“客户”吗?或者考虑到Clients 是公开的,我应该以不同的方式进行测试吗?

【问题讨论】:

  • new PrivateType(typeof(Clients)) ? (旁注:你甚至应该直接测试私有成员吗?这会通过对象的接口和它的实现产生很多耦合,这应该与测试无关。)
  • 构造函数需要System.Type的实例,而不是类型名称:new PrivateType(typeof(Clients))
  • 向我们展示 PrivateType 的构造函数。它期待什么?你目前拥有的东西没有多大意义,这正是编译器告诉你的
  • 谢谢@David 和 Dennis_E,这似乎很明显......现在 :)

标签: c# unit-testing


【解决方案1】:

或者鉴于Clients 是公开的,我应该以不同的方式进行测试吗?

是的:Clients 是您正在测试的单元。如果它没有公开GenerateAddresses,那么它就不是其表面​​ API 的一部分,理论上只是为了支持类的内部结构。

在单元测试中,测试类的可观察行为 - 不要担心它在内部是如何进行的。

【讨论】:

  • 好的,但是在开发过程中我需要测试GenerateAddresses私有方法执行的(相当长的)代码。有没有更好的方法来做到这一点?
  • 单元测试可以暗示设计的味道。如果它是您想要测试的东西,它应该是公开的。如果您在私有方法中做了太多工作,请考虑将您的私有部分拆分为一个新类,该类本身具有可测试的公共接口。然后使用这个新类而不是私有方法。
  • 确定要直接测试吗?如果它是private,它是供班级其他成员使用的(即测试那些)。就课程的消费者(和您的测试)而言,它可能会更改或被完全删除。
  • @JamesThorpe 好的,我开始明白了...实际上我可以测试实际使用此私有方法的公共方法。无论如何,我需要稍后再做...谢谢!
【解决方案2】:

var testClients = new PrivateType(typeof(Clients));

PrivateType 需要 Type 对象而不是符号名称。

但我宁愿建议重新考虑您的测试策略。通常不需要测试私有方法。如果您发现无法从公共方法中获得良好的代码覆盖率,您可能需要进行一些重构。

【讨论】:

    猜你喜欢
    • 2011-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-17
    • 1970-01-01
    • 2012-02-11
    • 1970-01-01
    • 2017-06-19
    相关资源
    最近更新 更多