Rob*_*vey 7 c# recursion unit-testing
我有三个看起来像这样的函数:
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
}
Run Code Online (Sandbox Code Playgroud)
鉴于这三种方法是相互递归的,那么如何独立地对它们进行单元测试呢?
通常,您不需要单独测试每个方法 - 您可以测试顶级方法是否正确.
但是,如果由于某种原因您希望单独测试每个方法,则可以像测试任何具有依赖项的方法一样使用依赖项注入.这里唯一的区别是依赖是对象本身.以下是一些示例代码来演示这个想法:
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));
}
}
}
Run Code Online (Sandbox Code Playgroud)
当测试nodegetter参数时,传递一个mock.
我还将您的方法从私有更改为公共,因为最好只测试您的类的公共接口.