Autofixture ObjectCreationException - 循环引用:RuntimeParameterInfo 或 Ploeh.AutoFixture.Kernel.SeededRequest

2023-12-22

我一直在尝试对一些简单的不可变对象进行建模,其中我有两个构造函数重载:一个重载接受每个只读属性的参数,另一个接受其自身的实例进行克隆(以便在大多数属性时使用)值将与另一个实例的值相同)。

public class Parent {
    public Parent(Child child, Pet pet) {
        Child = child;
        Pet = pet;
    }

    public Parent(Parent template) {
        Child = template.Child;
        Pet = template.Pet;
    }

    public Child Child { get; private set; }
    public Pet Pet { get; private set; }
}

正如我所期望的,这个测试通过了:

[Theory]
[AutoData]
public void Properties_Equal_Constructor_Arguments(Child expectedChild, Pet expectedPet)
{
    // act
    var sut = new Parent(expectedChild, expectedPet);

    // assert
    sut.Child.Should().Be(expectedChild);
    sut.Pet.Should().Be(expectedPet);
}

但这个测试抛出了一个Ploeh.AutoFixture.ObjectCreationException,无法创建类型的实例System.Reflection.RuntimeParameterInfo(使用 AutoData 参数),或键入Ploeh.AutoFixture.Kernel.SeededRequest(不使用自动数据)(?!?)

[Theory]
[AutoData]
public void Properties_Equal_Properties_Of_Template_Constructor_Argument(Parent template)
{
    // arrange
    //var fixture = new Fixture();            // yields same error but for type
    //var template = fixture.Create<Parent>();// Ploeh.AutoFixture.Kernel.SeededRequest
    var expectedChild = template.Child;
    var expectedPet = template.Pet;

    // act
    var sut = new Parent(template);

    // assert
    sut.Child.Should().Be(expectedChild);
    sut.Pet.Should().Be(expectedPet);
}

首先,我在我的类中没有发现任何循环引用,就像您通常在有关此问题的问题中看到的那样,其中子对象具有对其父对象的属性引用(就像数据库实体建模有时会发生的情况一样)。其次,当我过去收到此错误时,它指的是对我的类中明确使用的类型的循环引用,与本例不同。

为什么会发生这种情况?

为了完整起见,以下是其他相关类和收到的完整错误消息:

public class Child {
    public Child(string value) {
        Value = value;
    }
    public string Value { get; private set; }
}

public class Pet {
    public Pet(string name) {
        Name = name;
    }
    public string Name { get; private set; }
}

System.InvalidOperationException 获取时抛出异常 理论数据 AutoFixtureTests.CircularReferenceTests.Properties_Equal_Properties_Of_Template_Constructor_Argument: Ploeh.AutoFixture.ObjectCreationException:AutoFixture 无法 创建 System.Reflection.RuntimeParameterInfo 类型的实例 因为遍历的对象图包含循环引用。 有关圆形路径的信息如下。这是正确的 当 Fixture 配备 ThrowingRecursionBehavior 时的行为, 这是默认值。这可以确保您被告知 代码中的循环引用。你的第一反应应该是 重新设计您的 API 以消除所有循环引用。 但是,如果这是不可能的(很可能是因为部分或全部 该API由第三方提供),您可以替换此默认值 具有不同行为的行为:在 Fixture 实例上,删除 Fixture.Behaviors 中的 ThrowingRecursionBehavior,然后添加 OmitOnRecursionBehavior 的实例。小路: AutoFixtureTests.Parent 模板 --> AutoFixtureTests.Parent --> AutoFixtureTests.Parent 模板 --> Ploeh.AutoFixture.Kernel.SeedRequest

在 Ploeh.AutoFixture.Kernel.ThrowingRecursionHandler.HandleRecursiveRequest(对象 请求,IEnumerable1 recordedRequests) at Ploeh.AutoFixture.Kernel.RecursionGuard.Create(Object request, ISpecimenContext context) at Ploeh.AutoFixture.Kernel.CompositeSpecimenBuilder.Create(Object request, ISpecimenContext context) at Ploeh.AutoFixture.Kernel.CompositeSpecimenBuilder.Create(Object request, ISpecimenContext context) at Ploeh.AutoFixture.Kernel.Postprocessor1.创建(对象请求, ISpecimenContext 上下文)位于 Ploeh.AutoFixture.Kernel.CompositeSpecimenBuilder.Create(对象 请求,ISpecimenContext 上下文)位于 Ploeh.AutoFixture.Kernel.TracingBuilder.Create(对象请求, ISpecimenContext 上下文)位于 Ploeh.AutoFixture.Kernel.TerminateWithPathSpecimenBuilder.Create(对象 请求,ISpecimenContext 上下文)位于 Ploeh.AutoFixture.Kernel.RecursionGuard.Create(对象请求, ISpecimenContext 上下文)位于 System.Linq.Enumerable.WhereSelectArrayIterator2.MoveNext() at System.Collections.Generic.List1..ctor(IEnumerable1 collection)
at System.Linq.Enumerable.ToList[TSource](IEnumerable
1 个来源)位于 Ploeh.AutoFixture.Kernel.MethodInvoker.Create(对象请求, ISpecimenContext 上下文)位于 Ploeh.AutoFixture.Kernel.CompositeSpecimenBuilder.Create(对象 请求,ISpecimenContext 上下文)位于 Ploeh.AutoFixture.Kernel.CompositeSpecimenBuilder.Create(对象 请求,ISpecimenContext 上下文)位于 Ploeh.AutoFixture.Kernel.Postprocessor1.Create(Object request, ISpecimenContext context) at Ploeh.AutoFixture.Kernel.CompositeSpecimenBuilder.Create(Object request, ISpecimenContext context) at Ploeh.AutoFixture.Kernel.TracingBuilder.Create(Object request, ISpecimenContext context) at Ploeh.AutoFixture.Kernel.TerminatingWithPathSpecimenBuilder.Create(Object request, ISpecimenContext context) at Ploeh.AutoFixture.Kernel.RecursionGuard.Create(Object request, ISpecimenContext context) at Ploeh.AutoFixture.Kernel.CompositeSpecimenBuilder.Create(Object request, ISpecimenContext context) at Ploeh.AutoFixture.Kernel.CompositeSpecimenBuilder.Create(Object request, ISpecimenContext context) at Ploeh.AutoFixture.Kernel.Postprocessor1.创建(对象请求, ISpecimenContext 上下文)位于 Ploeh.AutoFixture.Kernel.CompositeSpecimenBuilder.Create(对象 请求,ISpecimenContext 上下文)位于 Ploeh.AutoFixture.Kernel.TracingBuilder.Create(对象请求, ISpecimenContext 上下文)位于 Ploeh.AutoFixture.Kernel.TerminateWithPathSpecimenBuilder.Create(对象 请求,ISpecimenContext 上下文)位于 Ploeh.AutoFixture.Kernel.RecursionGuard.Create(对象请求, ISpecimenContext 上下文)位于 Ploeh.AutoFixture.Kernel.CompositeSpecimenBuilder.Create(对象 请求,ISpecimenContext 上下文)位于 Ploeh.AutoFixture.Kernel.CompositeSpecimenBuilder.Create(对象 请求,ISpecimenContext 上下文)位于 Ploeh.AutoFixture.Kernel.Postprocessor`1.Create(对象请求, ISpecimenContext 上下文)位于 Ploeh.AutoFixture.Kernel.CompositeSpecimenBuilder.Create(对象 请求,ISpecimenContext 上下文)位于 Ploeh.AutoFixture.Kernel.TracingBuilder.Create(对象请求, ISpecimenContext 上下文)位于 Ploeh.AutoFixture.Kernel.TerminateWithPathSpecimenBuilder.Create(对象 请求,ISpecimenContext 上下文)位于 Ploeh.AutoFixture.Kernel.RecursionGuard.Create(对象请求, ISpecimenContext 上下文)位于 Ploeh.AutoFixture.Xunit.AutoDataAttribute.GetData(MethodInfo methodUnderTest,类型 [] 参数类型)位于 Xunit.Extensions.TheoryAttribute.d_7.MoveNext() 在 Xunit.Extensions.TheoryAttribute.EnumerateTestCommands(IMethodInfo 方法)在 Xunit.Extensions.TheoryAttribute.c_DisplayClass5.b__1() 在 Xunit.Extensions.TheoryAttribute.LambdaTestCommand.Execute(对象 testClass)

当不使用 AutoDataAttribute 时:

Ploeh.AutoFixture.ObjectCreationException AutoFixture 无法 创建 Ploeh.AutoFixture.Kernel.SeededRequest 类型的实例 因为遍历的对象图包含循环引用。 有关圆形路径的信息如下。这是正确的 当 Fixture 配备 ThrowingRecursionBehavior 时的行为, 这是默认值。这可以确保您被告知 代码中的循环引用。你的第一反应应该是 重新设计您的 API 以消除所有循环引用。 但是,如果这是不可能的(很可能是因为部分或全部 该API由第三方提供),您可以替换此默认值 具有不同行为的行为:在 Fixture 实例上,删除 Fixture.Behaviors 中的 ThrowingRecursionBehavior,然后添加 OmitOnRecursionBehavior 的实例。小路: AutoFixtureTests.Parent 模板 --> AutoFixtureTests.Parent --> AutoFixtureTests.Parent 位于 Ploeh.AutoFixture.Kernel.ThrowingRecursionHandler.HandleRecursiveRequest(对象请求,IEnumerable1 recordedRequests) at Ploeh.AutoFixture.Kernel.RecursionGuard.Create(Object request, ISpecimenContext context) at Ploeh.AutoFixture.Kernel.CompositeSpecimenBuilder.Create(Object request, ISpecimenContext context) at Ploeh.AutoFixture.Kernel.CompositeSpecimenBuilder.Create(Object request, ISpecimenContext context) at Ploeh.AutoFixture.Kernel.Postprocessor1.Create(对象请求,ISpecimenContext上下文) 在 Ploeh.AutoFixture.Kernel.CompositeSpecimenBuilder.Create(对象请求,ISpecimenContext 上下文) 在 Ploeh.AutoFixture.Kernel.TracingBuilder.Create(对象请求,ISpecimenContext 上下文) 在 Ploeh.AutoFixture.Kernel.TerminateWithPathSpecimenBuilder.Create(对象请求,ISpecimenContext 上下文) 在 Ploeh.AutoFixture.Kernel.RecursionGuard.Create(对象请求,ISpecimenContext 上下文) 在 Ploeh.AutoFixture.Kernel.CompositeSpecimenBuilder.Create(对象请求,ISpecimenContext 上下文) 在 Ploeh.AutoFixture.Kernel.CompositeSpecimenBuilder.Create(对象请求,ISpecimenContext 上下文) 在 Ploeh.AutoFixture.Kernel.Postprocessor1.Create(Object request, ISpecimenContext context) at Ploeh.AutoFixture.Kernel.CompositeSpecimenBuilder.Create(Object request, ISpecimenContext context) at Ploeh.AutoFixture.Kernel.TracingBuilder.Create(Object request, ISpecimenContext context) at Ploeh.AutoFixture.Kernel.TerminatingWithPathSpecimenBuilder.Create(Object request, ISpecimenContext context) at Ploeh.AutoFixture.Kernel.RecursionGuard.Create(Object request, ISpecimenContext context) at System.Linq.Enumerable.WhereSelectArrayIterator2.MoveNext() 位于 System.Collections.Generic.List1..ctor(IEnumerable1 个集合)
在 System.Linq.Enumerable.ToList(IEnumerable1 source) at Ploeh.AutoFixture.Kernel.MethodInvoker.Create(Object request, ISpecimenContext context) at Ploeh.AutoFixture.Kernel.CompositeSpecimenBuilder.Create(Object request, ISpecimenContext context) at Ploeh.AutoFixture.Kernel.CompositeSpecimenBuilder.Create(Object request, ISpecimenContext context) at Ploeh.AutoFixture.Kernel.Postprocessor1.Create(对象请求,ISpecimenContext上下文) 在 Ploeh.AutoFixture.Kernel.CompositeSpecimenBuilder.Create(对象请求,ISpecimenContext 上下文) 在 Ploeh.AutoFixture.Kernel.TracingBuilder.Create(对象请求,ISpecimenContext 上下文) 在 Ploeh.AutoFixture.Kernel.TerminateWithPathSpecimenBuilder.Create(对象请求,ISpecimenContext 上下文) 在 Ploeh.AutoFixture.Kernel.RecursionGuard.Create(对象请求,ISpecimenContext 上下文) 在 Ploeh.AutoFixture.Kernel.CompositeSpecimenBuilder.Create(对象请求,ISpecimenContext 上下文) 在 Ploeh.AutoFixture.Kernel.CompositeSpecimenBuilder.Create(对象请求,ISpecimenContext 上下文) 在 Ploeh.AutoFixture.Kernel.Postprocessor`1.Create(对象请求,ISpecimenContext 上下文) 在 Ploeh.AutoFixture.Kernel.CompositeSpecimenBuilder.Create(对象请求,ISpecimenContext 上下文) 在 Ploeh.AutoFixture.Kernel.TracingBuilder.Create(对象请求,ISpecimenContext 上下文) 在 Ploeh.AutoFixture.Kernel.TerminateWithPathSpecimenBuilder.Create(对象请求,ISpecimenContext 上下文) 在 Ploeh.AutoFixture.Kernel.RecursionGuard.Create(对象请求,ISpecimenContext 上下文) 在 Ploeh.AutoFixture.SpecimenFactory.Create(ISpecimenContext 上下文,T 种子) 在 Ploeh.AutoFixture.SpecimenFactory.Create(ISpecimenContext 上下文) 在 AutoFixtureTests.CircularReferenceTests.Properties_Equal_Properties_Of_Template_Constructor_Argument() 在 AutoFixtureTests.cs 中:第 28 行


对于任何试图避免由于实体框架和虚拟成员而导致循环引用的人,这里有一个自定义,可以在生成模拟数据时忽略它们。

public class IgnoreVirtualMembers : ISpecimenBuilder
{
    public Type ReflectedType { get; }

    public object Create(object request, ISpecimenContext context)
    {
        var pi = request as PropertyInfo;
        if (pi != null) //// is a property
        {
            if (this.ReflectedType == null || //// is hosted anywhere
                this.ReflectedType == pi.ReflectedType) //// is hosted in defined type
            {
                if (pi.GetGetMethod().IsVirtual)
                {
                    return new OmitSpecimen();
                }
            }
        }

        return new NoSpecimen();
    }
}

public class IgnoreVirtualMembersCustomisation : ICustomization
{
    public void Customize(IFixture fixture)
    {
        fixture.Customizations.Add(new IgnoreVirtualMembers());
    }
}

随着用法:

new Fixture().Customize(new IgnoreVirtualMembersCustomisation());
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Autofixture ObjectCreationException - 循环引用:RuntimeParameterInfo 或 Ploeh.AutoFixture.Kernel.SeededRequest 的相关文章

随机推荐

  • “this._events || (this._events = {});”是什么意思意思是?

    我已经开始学习 Backbone js 目前我的 JavaScript 技能还不太好 我已经开始检查backbone js文件并遇到了一行奇怪的代码 我无法弄清楚其用途 代码示例 如果您需要更多上下文 请手动下载主干 js http bac
  • JFrame 调整大小以适应可见组件

    我有一个应用程序 我希望用户能够在正常设置和高级设置之间进行选择 现在 如果用户检查 JCheckBox 并且高级设置应该消失 问题就会开始 我的想法是将所有不必要的摆动组件 JScrollPane JLabel 设置为不可见 然后找到一种
  • Rails:如何解压缩压缩的 xml 请求正文?

    我有一个 Rails 3 站点 它从 iPhone 应用程序获取 xml 请求 包括文件提交 iPhone 应用程序压缩其 xml 请求的正文 这些请求像这样传递到我的控制器 这是一个简单的请求 仅更新一些详细信息而不是发送任何文件 par
  • 是什么决定了验证器的触发顺序?

    我有一个带有两个自定义验证器的网络表单 用于验证字符串是否为日期 我不在乎什么格式 只要它是可解析的 另一种方法是确保一个日期等于或大于另一个日期 我只是无法让比较验证器能够很好地处理任何日期格式
  • Windows 上有类似于supervisord 的吗?

    我需要运行 python 脚本并确保它在终止后重新启动 我知道有一个名为supervisord 的UNIX 解决方案 但不幸的是 我的脚本必须运行的服务器是在 Windows 上 你知道什么工具有用吗 谢谢 尽管有很大的免责声明here h
  • “ndarray”类型的对象不可 JSON 序列化

    我是 python 和机器学习的新手 我有一个线性回归模型 它能够根据我转储用于 Web 服务的输入来预测输出 请参阅下面的代码 X train X test y train y test train test split X y test
  • 如何让 Perl::Critic 在其输出中显示违规策略?

    有人告诉我有可能Perl Critic http search cpan org perldoc Perl 3a 3aCritic显示在其输出中存在问题的策略名称 但我不记得我必须做什么才能打开它 如何在perlcritic rc The
  • 将自定义AuthenticationProvider添加到Spring Boot + oauth +oidc

    我使用 SpringBoot 2 1 7 和 Okta 提供身份验证服务开发了一个基本的 oauth oidc 示例 这是我的 Gradle 依赖设置供参考 plugins id org springframework boot versi
  • 如何解决“无法为连接 URL 创建类 'com.mysql.jdbc.Driver' 的 JDBC 驱动程序”

    首先我想说我检查了 stackoverflow 上的所有答案 但我无法修复这个错误 请帮帮我 我花了很多时间 却没有任何结果 我正在尝试使用 Tomcat8 创建连接池 我有一个例外 java sql SQLException 无法创建类的
  • SSH 指纹与 Gitlab.com 不匹配

    我向我的帐户添加了 ED25519 公钥gitlab com 然后我设置了我的 ssh config使用私钥Host gitlab com Host gitlab com gitlab com User git IdentityFile s
  • 将鼠标悬停在 Jquery SlideDown 菜单上时保持该菜单打开吗?

    我的 Jquery SlideDown 菜单遇到一些困难 当我将鼠标悬停在触发slideDown事件的按钮上时 它工作得很好 但是当我将鼠标悬停在向下滑动的子菜单上时 它会触发slideUp事件并关闭菜单 我正在寻找一种方法来更改我的代码
  • 如何在 DIV 中的长单词中强制换行?

    好吧 这真的让我很困惑 我在 div 中有一些内容 如下所示 div style background color green width 200px height 300px Thisisatest Thisisatest Thisisa
  • FFmpeg - 从传输流文件(.ts)中提取视频和音频

    我希望提取传输流文件中某个节目的音视频 ts 方法是在不损失质量的情况下指定其 PID 并在结果文件中使用相同的编解码器 输出文件是 MPEG 是这样吗possible与 FFmpeg 如果是这样 我该怎么办 到目前为止 我已经收到了这个命
  • 如何将 COGROUP 用于大型数据集

    我有两个rdd s namely val tab a RDD String String and val tab b RDD String String 我在用着cogroup对于那些数据集 例如 val tab c tab a cogro
  • 带 JavaScript 控件的 Flash MP3 播放器

    虽然这个问题看起来相当基本 但我似乎无法真正找到符合我需求的任何东西 这些需求是 可换肤 尽管不是 100 必需 可通过 javascript 控制 开始 停止 改变轨道 自定义函数的事件触发器 主要在赛道完成时 实际文档 而不是 它可以做
  • Azure-data-Factory 复制数据如果某个文件存在

    我的 blob 容器中有很多文件 但是 我只想仅当 blob 容器上存在某个文件 例如 SRManifest csv 时才运行存储过程 我在数据工厂上使用了获取元数据和 IF 条件 你能帮我写一下动态脚本吗 我试过这个 bool start
  • 库未加载

    我在应用程序中添加了 Social framework 就像添加其他框架一样 我已经下载了 xcode 4 5 和 iOS 6 但我的应用程序仅在设备上因以下错误而崩溃 它在模拟器上运行良好 dyld Library not loaded
  • 如何使用 MEF 导出和导入函数并执行它们?

    我正在创建一个导入多个插件的应用程序 我需要能够执行每个插件中实现的功能 例如 我需要做这样的事情 MainApp ImportMany public IEnumerable
  • 如何设置JPanel的宽度和高度?

    我正在使用 Java 开发贪吃蛇游戏 棋盘 所有动作发生的地方 的宽度和高度应该是固定的 640 像素 480 像素 结构 主班延伸自JFrame class Board延伸自的类JPanel class In Main类我有类似的东西 s
  • Autofixture ObjectCreationException - 循环引用:RuntimeParameterInfo 或 Ploeh.AutoFixture.Kernel.SeededRequest

    我一直在尝试对一些简单的不可变对象进行建模 其中我有两个构造函数重载 一个重载接受每个只读属性的参数 另一个接受其自身的实例进行克隆 以便在大多数属性时使用 值将与另一个实例的值相同 public class Parent public P