我怎样才能找出为什么AutoFixture抛出Kernel.OmitSpecimen异常

Kei*_*oom 5 autofixture

我正在研究一个相当嵌套的模型,它有一些循环引用.它还使用实体框架,因此所有列表都是ICollection<T>.为了适应这种情况,我正在配置AutoFixture,如下所示:

_fixture = new Fixture().Customize(new MultipleCustomization());
_fixture.Behaviors.Remove(new ThrowingRecursionBehavior());
_fixture.Behaviors.Add(new OmitOnRecursionBehavior());
Run Code Online (Sandbox Code Playgroud)

当我尝试创建一个类型

_fixture.CreateAnonymous<Session>();
Run Code Online (Sandbox Code Playgroud)

AutoFixture有问题,并引发以下错误

System.InvalidCastException:无法将类型为'Ploeh.AutoFixture.Kernel.OmitSpecimen'的对象强制转换为'The.Model.Language'

如果我在Session类型中排除集合Language,则AutoFixture会为图中的其他类型抛出相同的异常.

有没有办法从AutoFixture中提取更多信息,例如导致错误的属性?

为什么AutoFixture试图将我的类型转换为OmitSpecimen以及在此过程中可能发生什么以防止它被强制转换?

我在这里为堆栈跟踪创建了一个要点.

更新

我设法重现了这个问题.鉴于这对对象

public class Session
{
    public Language Language { get; set; }
}

public class Language
{
    public ICollection<Session> Sessions { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

调用_fixture.CreateAnonymous<Session>();将抛出强制转换异常.

Jak*_*kob 0

这适用于较新版本AutoFixture(例如 3.31.3)。

这段代码确实运行:

    public class Session
    {
        public Language Language { get; set; }
    }

    public class Language
    {
        public ICollection<Session> Sessions { get; set; }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var fixture = new Fixture();
            fixture.Behaviors.Add(new OmitOnRecursionBehavior());

           var session = fixture.Create<Session>();

            Debug.Assert(session != null, "Session should not be null");
        }
    }
Run Code Online (Sandbox Code Playgroud)