gpt4 book ai didi

c# - AutoFixture 是否会被深而圆形的对象图所淹没

转载 作者:行者123 更新时间:2023-12-04 11:35:37 27 4
gpt4 key购买 nike

我正在使用的域模型有很多循环引用。事实上,可以从图中的任何点到达大多数对象。许多这些循环引用也在集合中。所以一个 Booking将收藏 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 创建一个永远不会结束的无限图?如果是这样,有什么方法可以配置它来限制图形的深度?

最佳答案

我意识到这是一个老问题,但是对于发现此问题的任何人,我认为 OmitOnRecursionBehaviour 的行为可能已更改(或已修复:-)。它的默认递归深度为 1。
并且您可以指定 recursionDepth。如果设置得太深,则会导致 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;}
}

关于c# - AutoFixture 是否会被深而圆形的对象图所淹没,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12727245/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com