我正在研究一个相当嵌套的模型,它有一些循环引用。它还使用实体框架,因此所有列表都是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; }
}
的调用将抛出强制转换异常。
答案 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");
}
}