7

我正在使用的域模型有很多循环引用。事实上,可以从图中的任何点到达大多数对象。许多这些循环引用也在集合中。所以 aBooking将有一个集合,Students其中有一个集合,Courses其中有一个集合,Bookings依此类推。这不是真正的模型,只是一个例子。这个问题是由大约三十个不同类别的组合引起的。

为了使用这个模型,我像这样配置和使用 AutoFixture

var fixture = new Fixture().Customize(new MultipleCustomization());
fixture.Behaviors.Remove(new ThrowingRecursionBehavior());
fixture.Behaviors.Add(new OmitOnRecursionBehavior());

var booking = fixture.CreateAnonymous<Booking>();

这会导致 AutoFixture 运行大约 20 分钟,直到它最终以 OutOfMemoryException 失败。

这个模型是否要求 AutoFixture 创建一个永远不会结束的无限图?如果是这样,有什么方法可以配置它来限制图形的深度?

4

1 回答 1

0

我意识到这是一个老问题,但对于任何发现这个问题的人,我认为 的行为OmitOnRecursionBehaviour可能已经改变(或已修复:-)。它默认递归深度为 1。

您可以指定递归深度。如果设置得太深,它会导致 StackOverflowException,而不是 OutOfMemoryException,至少对我来说是这样。

无论如何,这是一个简单的例子。

void Main()
{   
    var fixture = new Fixture();
    fixture
        .Behaviors
        .OfType<ThrowingRecursionBehavior>()
        .ToList()
        .ForEach(b => fixture.Behaviors.Remove(b));
        
    fixture.Behaviors.Add(new OmitOnRecursionBehavior(10));
    var node = fixture.Create<Node>();      
    
    Console.WriteLine($"It goes {HowDeepDoesItGo(node)} levels down");  
    // Outputs:
    //     It goes 10 levels down
    // With OmitOnRecursionBehavior(), without the recursionDepth argument, then outputs:
    //     It goes 1 levels down
}

int HowDeepDoesItGo(Node node, int level = 1)
{
    if (node.Link is null) return level;
    return HowDeepDoesItGo(node.Link, level + 1);
}

public class Node
{   
    public Node Link { get; init;}
}
于 2021-08-18T15:25:02.340 回答