如何在不破坏结构API的情况下测试结构的内部表示?

时间:2017-12-15 16:10:27

标签: unit-testing testing

我有MaxHeap类,它提供了一个堆将要执行的所有常用属性(ExtractMax,Add,Build)。现在我想测试它,但为了测试它,我需要使用我在内部使用它的结构(数组),以验证是否违反了堆属性。

堆属性是堆的每个节点(在整数的上下文中)比它的子节点更大,这可以通过此函数轻松完成,例如

/// <summary>
///  Determines if given array is max maxHeap.
/// </summary>
/// <typeparam name="T">Type of the elements contained in the maxHeap.</typeparam>
/// <param name="maxHeap"> The maxHeap.</param>
/// <param name="index"> Index from which to start.</param>
/// <returns>Whether the heap is max heap or not.</returns>
private static bool IsMaxHeap<T>(MaxHeap<T> maxHeap, int index = 0)
{
    // if it is a leaf it is max maxHeap.
    if (index >= (maxHeap.Count - 1)/2)
    {
        return true;
    }

    return Comparer<T>.Default.Compare(maxHeap[index], maxHeap[2 * index + 1]) > 0
           && Comparer<T>.Default.Compare(maxHeap[index], maxHeap[2 * index + 2]) > 0
           && IsMaxHeap(maxHeap, 2 * index + 1)
           && IsMaxHeap(maxHeap, 2 * index + 2);
}

但是这需要你的堆类具有公共索引器。如果我有权访问堆的内部表示,那么通过传递数组而不是MaxHeap或通过MaxHeap对象直接访问它,这个函数会变得更容易,但我不认为这是怎么回事应该这样做,因为结构的内部表示不应该暴露。

在不弄乱Heap类API的情况下,这样做的正确方法是什么?

  • 我应该在我的测试项目中复制代码并复制MaxHeap类,并公开所有需要的信息吗?
  • 或者可能在MaxHeap类中添加一些受保护的索引器并使用存根进行测试?(不要喜欢这种方法,因为它离开了继承我的类并获得对该索引器的访问权限,这基本上打败了不改变MaxHeap
  • 的API的逻辑

0 个答案:

没有答案