C#测试公共静态类的私有静态方法

C#测试公共静态类的私有静态方法,c#,unit-testing,C#,Unit Testing,我对如何执行这些测试有点困惑。我知道存在测试私有类的PrivateObject和测试私有静态类的PrivateType,但是如何测试公共静态类的私有静态方法呢 public static class Clients { // CUT private static List<string> GenerateAddresses(string AppPath) { // CUT } } 但是我得到了错误 “Clients”是一种类型,在给定上下文中

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

public static class Clients {
    // CUT
    private static List<string> GenerateAddresses(string AppPath) {
        // CUT
    }
}
但是我得到了错误

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

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

或者,考虑到
客户机是公共的,我应该以不同的方式进行测试吗

是:
客户端
是您正在测试的单元。如果它没有公开
generateAddress
,那么它就不是其表面API的一部分,理论上只是用来支持类的内部结构

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

或者,考虑到
客户机是公共的,我应该以不同的方式进行测试吗

是:
客户端
是您正在测试的单元。如果它没有公开
generateAddress
,那么它就不是其表面API的一部分,理论上只是用来支持类的内部结构


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

var testClients=new PrivateType(typeof(Clients))

PrivateType
需要对象而不是符号名


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

var testClients=new PrivateType(typeof(Clients))

PrivateType
需要对象而不是符号名


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

newprivateType(typeof(Clients))
?(旁注:您甚至应该直接测试私有成员吗?这会通过对象的接口及其实现产生大量耦合,这与测试无关。)构造函数需要
System.Type的实例,而不是类型名称:
new PrivateType(typeof(Clients))
显示PrivateType的构造函数。它期望什么?您当前拥有的内容没有多大意义,而这正是编译器所说的you@bashrc谢谢你@David和Dennis_E,看起来很明显。。。现在:)
newprivateType(typeof(Clients))
?(旁注:您甚至应该直接测试私有成员吗?这会通过对象的接口及其实现产生大量耦合,这与测试无关。)构造函数需要
System.Type的实例,而不是类型名称:
new PrivateType(typeof(Clients))
显示PrivateType的构造函数。它期望什么?您当前拥有的内容没有多大意义,而这正是编译器所说的you@bashrc谢谢你@David和Dennis_E,看起来很明显。。。现在:)好的,但是我需要测试
generateAddress
private方法执行的(相当长的)代码。有更好的方法吗?单元测试可以暗示设计的味道。如果你想测试它,它应该是公开的。如果你在你的私有方法中做了太多的工作,考虑把你的私有部分分割成一个新的类,这个类可以测试它自己的公共接口。然后使用这个新类而不是私有方法。您确定需要直接测试它吗?如果它是
私有的
,它就在那里供类中的其他成员使用(即测试这些成员)。就类(和您的测试)的使用者而言,它可能会更改,或者被完全删除。@JamesThorpe好的,我开始了解它了。。。事实上,我可以测试实际使用这个私有方法的公共方法。不管怎样,我需要以后再做。。。非常感谢。好的,但是我需要测试
generateAddress
private方法执行的(相当长的)代码。有更好的方法吗?单元测试可以暗示设计的味道。如果你想测试它,它应该是公开的。如果你在你的私有方法中做了太多的工作,考虑把你的私有部分分割成一个新的类,这个类可以测试它自己的公共接口。然后使用这个新类而不是私有方法。您确定需要直接测试它吗?如果它是
私有的
,它就在那里供类中的其他成员使用(即测试这些成员)。就类(和您的测试)的使用者而言,它可能会更改,或者被完全删除。@JamesThorpe好的,我开始了解它了。。。事实上,我可以测试实际使用这个私有方法的公共方法。不管怎样,我需要以后再做。。。非常感谢。
PrivateType testClients = new PrivateType(Clients);