You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何测试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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 10:11:35