如何测试BinaryTree类中显式实现的IEnumerable.GetEnumerator方法?
问题描述
我编写了一个实现IEnumerable<T>、IReadOnlyCollection<T>接口的BinaryTree<T>类,核心代码片段如下:
public class BinaryTree<T> : IEnumerable<T>, IReadOnlyCollection<T> where T : IComparable { // 其他代码省略......... public IEnumerator<T> GetEnumerator() { return PreOrder().GetEnumerator(); } IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); // 其他代码省略......... }
我已经为泛型版本的GetEnumerator()方法编写了可正常运行的单元测试用例:
[Fact] public void GetEnumerator() { BinaryTree<int> tree = new BinaryTree<int>(); int exc = 5; tree.Add(5); IEnumerator e = tree.GetEnumerator(); e.MoveNext(); Object act = e.Current; act.Should().Be(exc); }
请问如何对其中显式实现的IEnumerable.GetEnumerator()方法编写单元测试?
解决方案
要测试显式实现的接口方法,核心是将BinaryTree<T>实例转换为非泛型IEnumerable接口类型,以此触发显式实现的方法调用。具体测试代码如下:
[Fact] public void IEnumerable_GetEnumerator() { BinaryTree<int> tree = new BinaryTree<int>(); int expected = 5; tree.Add(5); // 将类实例转换为非泛型IEnumerable接口 IEnumerable nonGenericEnumerable = tree; IEnumerator enumerator = nonGenericEnumerable.GetEnumerator(); enumerator.MoveNext(); object actual = enumerator.Current; actual.Should().Be(expected); }
关键说明
- 显式实现的接口方法无法通过类实例直接调用,必须通过对应的接口类型访问。
- 转换为
IEnumerable后调用GetEnumerator(),会触发你显式实现的非泛型版本,而非类的泛型GetEnumerator()方法。 - 可扩展测试场景:比如添加多个节点,验证遍历顺序(如你的
PreOrder()前序逻辑),确保两种枚举器的行为完全一致。
内容的提问来源于stack exchange,提问作者Izauma
相关产品推荐
相关产品推荐

