我有三个看起来像这样的函数:
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.
我还将您的方法从私有更改为公共,因为最好只测试您的类的公共接口.