Visual Studio允许通过自动生成的访问器类对私有方法进行单元测试。我已经编写了一个测试成功的私有方法的测试,但是在运行时失败。相当简单的代码版本和测试是:
//in project MyProj class TypeA { private List<TypeB> myList = new List<TypeB>(); private class TypeB { public TypeB() { } } public TypeA() { } private void MyFunc() { //processing of myList that changes state of instance } } //in project TestMyProj public void MyFuncTest() { TypeA_Accessor target = new TypeA_Accessor(); //following line is the one that throws exception target.myList.Add(new TypeA_Accessor.TypeB()); target.MyFunc(); //check changed state of target }
运行时错误为:
Object of type System.Collections.Generic.List`1[MyProj.TypeA.TypeA_Accessor+TypeB]' cannot be converted to type 'System.Collections.Generic.List`1[MyProj.TypeA.TypeA+TypeB]'.
根据智能感知-因此我猜编译器-目标是TypeA_Accessor类型。但是在运行时,它的类型为TypeA,因此列表添加失败。
有什么办法可以阻止此错误?或者,更可能的是,其他人还有什么其他建议(我预测也许“不要测试私有方法”和“不要让单元测试操纵对象的状态”)。
是的,不要测试私有方法。…单元测试的想法是通过其公共“ API”测试单元。
如果发现需要测试许多私有行为,则很可能在要测试的类中隐藏了一个新的“类”,将其提取并通过其公共接口对其进行测试。
一个建议/思考工具.....有一种想法认为任何方法都不应该是私有的。意味着所有方法都应该存在于对象的公共接口上……如果您认为需要将其设为私有,则很可能存在于另一个对象上。
这条建议在实践中还没有完全解决,但它主要是很好的建议,通常会促使人们将其对象分解为较小的对象。