C# 为测试创建对象层次结构

C# 为测试创建对象层次结构,c#,unit-testing,hierarchical-data,C#,Unit Testing,Hierarchical Data,我正在构建一个测试驱动的应用程序,将平面文件排序为父子层次结构。现在我想为我自己的排序创建一个非常通用的测试。为此,我想生成一些测试数据,然后进行排序 将被排序的对象将如下所示: public interface IHierarchicalUnitWithChildren { string Id { get; } string ParentId { get; } IList<IHierarchicalUnitWithChildren> Children { g

我正在构建一个测试驱动的应用程序,将平面文件排序为父子层次结构。现在我想为我自己的排序创建一个非常通用的测试。为此,我想生成一些测试数据,然后进行排序

将被排序的对象将如下所示:

public interface IHierarchicalUnitWithChildren
{
    string Id { get; }
    string ParentId { get; }
    IList<IHierarchicalUnitWithChildren> Children { get; set; }
}
公共接口IHierarchicalUnitWithChildren
{
字符串Id{get;}
字符串ParentId{get;}
IList子项{get;set;}
}
但是我不想自己创建测试对象。我希望这是由代码生成的,如下所示:

        _items = new List<IHierarchicalUnitWithChildren>();
        Random random = new Random();

        for (int i = 1; i < 1000; i++)
        {
            var item = new HierarchicalUnitMock()
            {
                Oid = i.ToString(),
                Children = new List<IHierarchicalUnit>(),
            };

            // We need a couple of roots.
            if (i%100 != 0)
            {
                item.Poid = random.Next(1, 100).ToString();
            }

            _items.Add(item);
        }
\u items=新列表();
随机=新随机();
对于(int i=1;i<1000;i++)
{
var item=新的HierarchycalUnitMock()
{
Oid=i.ToString(),
Children=新列表(),
};
//我们需要一些根。
如果(i%100!=0)
{
item.Poid=random.Next(1100).ToString();
}
_项目。添加(项目);
}
我可以很容易地生成一千个项目,但我还需要给它们一个有效的父级。我如何确保我正在创建一个有效的结构,在这里我有几个根,所有的孩子都有有效的父母

任何项目都不应该有一个父项是其自身的子项(或孙子项),从而使其成为一个无限层次

还是我想的全错了?测试是否应该始终具有静态数据

更新:


是否有任何方法可以通过智能循环实现这一点,该循环始终生成相同的数据?所以测试用例总是相同的?

在测试中随机实时生成数据不是一个好主意。您无法保证每次的测试条件都是相同的,也无法保证覆盖所有可能的场景

改为:


想一想你的代码是做什么的,如果有必要的话,把它分解成伪代码,然后试着想出一些可能破坏它的场景。将您的测试数据设置为专门导致这些情况的数据。

好吧,我准备同意您的看法。正如您所说,测试用例并不是每次都是相同的,它是测试的关键组件之一。