一尘不染

在C#中对私有方法进行单元测试

c#

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,因此列表添加失败。

有什么办法可以阻止此错误?或者,更可能的是,其他人还有什么其他建议(我预测也许“不要测试私有方法”和“不要让单元测试操纵对象的状态”)。


阅读 643

收藏
2020-05-19

共1个答案

一尘不染

是的,不要测试私有方法。…单元测试的想法是通过其公共“ API”测试单元。

如果发现需要测试许多私有行为,则很可能在要测试的类中隐藏了一个新的“类”,将其提取并通过其公共接口对其进行测试。

一个建议/思考工具.....有一种想法认为任何方法都不应该是私有的。意味着所有方法都应该存在于对象的公共接口上……如果您认为需要将其设为私有,则很可能存在于另一个对象上。

这条建议在实践中还没有完全解决,但它主要是很好的建议,通常会促使人们将其对象分解为较小的对象。

2020-05-19