我正在使用的领域模型有很多循环引用。事实上,从图中的任何点都可以到达大多数对象。许多这些循环引用也在集合中。因此,
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 运行大约二十分钟,直到最终因 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;}
}
如果以上建议没有帮助,您还可以尝试使用:
Fixture fixture = new Fixture();
fixture.OmitAutoProperties = omitAutoProperties;
有时这可能就足够了。特别是如果属性导致问题但对于初始化来说不是必需的。
P.S.:我知道这是一个旧线程。也许它仍然对任何人有帮助。