5

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

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

当我尝试创建类型时

_fixture.CreateAnonymous<Session>();

AutoFixture 有问题并抛出以下错误

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

如果我排除Sessiontype中的集合Language,AutoFixture 会为图中的另一种类型抛出相同的异常。

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

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

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

更新

我设法重现了这个问题。给定这对对象

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

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

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

4

1 回答 1

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");
        }
    }
于 2015-08-12T06:53:41.507 回答