c# – 如何对相互递归方法进行单元测试?

前端之家收集整理的这篇文章主要介绍了c# – 如何对相互递归方法进行单元测试?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有三个看起来像这样的函数
private Node GetNode(Node parentNode)
{
    var node = new node();

    switch (parentNode.NodeType)
    {
       case NodeType.Multiple:    node = GetMultipleNode(parentNode)
       case NodeType.Repeating:   node = GetRepeatingNode(parentNode)
    }

    return node;
}

private Node GetMultipleNode(Node parentNode)
{
    foreach (var child in parentNode.Children)
        return GetNode(child);
}

private Node GetRepeatingNode(Node parentNode)
{
    for (int i=0; i < parentNode.Count; i++)
         return GetNode(new Node(i));  // Assume meaningful constructor for Node
}

鉴于这三种方法是相互递归的,那么如何独立地对它们进行单元测试呢?

解决方法

通常,您不需要单独测试每个方法 – 您可以测试顶级方法是否正确.

但是,如果由于某种原因您希望单独测试每个方法,则可以像测试任何具有依赖项的方法一样使用依赖项注入.这里唯一的区别是依赖是对象本身.以下是一些示例代码来演示这个想法:

class NodeGetter : INodeGetter
{
    public Node GetNode(Node parentNode)
    {
        return GetNode(parentNode,this);
    } 

    public Node GetNode(Node parentNode,INodeGetter nodeGetter)
    {
        switch (parentNode.NodeType)
        {
           case NodeType.Multiple:
               return nodeGetter.GetMultipleNode(parentNode,nodeGetter);
           case NodeType.Repeating:
               return nodeGetter.GetRepeatingNode(parentNode,nodeGetter);
           default:
               throw new NotSupportedException(
                   "Node type not supported: " + parentNode.NodeType);
        }
    }

    public Node GetMultipleNode(Node parentNode,INodeGetter nodeGetter)
    {
        foreach (Node child in parentNode.Children)
        {
            return nodeGetter.GetNode(child);
        }
    }

    public Node GetRepeatingNode(Node parentNode,INodeGetter nodeGetter)
    {
        for (int i = 0; i < parentNode.Count; i++)
        {
            // Assume meaningful constructor for Node
            return nodeGetter.GetNode(new Node(i));
        }
    }
}

测试nodegetter参数时,传递一个mock.

我还将您的方法从私有更改为公共,因为最好只测试您的类的公共接口.

猜你在找的C#相关文章