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

时间:2012-09-21 13:52:12

标签: autofixture

我正在研究一个相当嵌套的模型,它有一些循环引用。它还使用实体框架,因此所有列表都是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:无法转换类型&#39; Ploeh.AutoFixture.Kernel.OmitSpecimen&#39;的对象。输入&#39; The.Model.Language&#39;

如果我在类型Session的{​​{1}}内排除集合,则AutoFixture会为图中的其他类型抛出相同的异常。

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

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

我已经为堆栈跟踪here创建了一个要点。

更新

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

Language

public class Session { public Language Language { get; set; } } public class Language { public ICollection<Session> Sessions { get; set; } } 的调用将抛出强制转换异常。

1 个答案:

答案 0 :(得分: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");
    }
}