如何为特定类别自定义 AutoFixture 行为

2024-03-26

我需要启用 AutoFixture 来创建具有循环引用的类型实例(来自第三方提供的 API)。为此,我可以删除默认的ThrowingRecursionBehavior如下所示:

public class RecursiveObjectCustomization : ICustomization
{
    public void Customize(IFixture fixture)
    {
        fixture.Behaviors.OfType<ThrowingRecursionBehavior>()
            .ToList()
            .ForEach(b => fixture.Behaviors.Remove(b));
        fixture.Behaviors.Add(new OmitOnRecursionBehavior());
    }
 }

但是,我知道这将删除ThrowingRecursionBehavior对于通过属性应用自定义时的所有类型。如何限制修改后的行为仅适用于特定类型?


您必须为此创建自定义行为。

这里有一些事情可以开始:

public class OmitOnRecursionForRequestBehavior : ISpecimenBuilderTransformation
{
    private const int DefaultRecursionDepth = 1;
    private readonly int recursionDepth;
    private readonly object request;

    public OmitOnRecursionForRequestBehavior(object request)
        : this(request, DefaultRecursionDepth)
    {
    }

    public OmitOnRecursionForRequestBehavior(
        object request,
        int recursionDepth)
    {
        if (request == null)
            throw new ArgumentNullException("request");
        if (recursionDepth < 1)
            throw new ArgumentOutOfRangeException(
                "recursionDepth",
                "Recursion depth must be greater than 0.");

        this.recursionDepth = recursionDepth;
        this.request = request;
    }

    public ISpecimenBuilder Transform(ISpecimenBuilder builder)
    {
        if (builder == null)
            throw new ArgumentNullException("builder");

        return new RecursionGuard(
            builder,
            new RecursionForRequestHandler(
                request,
                new OmitOnRecursionHandler(),
                builder),
            recursionDepth);
    }
}

public class RecursionForRequestHandler : IRecursionHandler
{
    private readonly object request;
    private readonly IRecursionHandler handlerForRequest;
    private readonly ISpecimenBuilder handler;

    public RecursionForRequestHandler(
        object request,
        IRecursionHandler handlerForRequest,
        ISpecimenBuilder handler)
    {
        if (request == null)
            throw new ArgumentNullException("request");
        if (handlerForRequest == null)
            throw new ArgumentNullException("handlerForRequest");
        if (handler == null)
            throw new ArgumentNullException("handler");

        this.request = request;
        this.handlerForRequest = handlerForRequest;
        this.handler = handler;
    }

    public object HandleRecursiveRequest(
        object request,
        IEnumerable<object> recordedRequests)
    {
        if (this.request.Equals(request))
            return handlerForRequest.HandleRecursiveRequest(
                request,
                recordedRequests);

        return handler.Create(request, new SpecimenContext(handler));
    }
}

您将这样使用它:

fixture.Behaviors.Add(new OmitOnRecursionForRequestBehavior(typeof(MyType)));
fixture.Behaviors.Add(new OmitOnRecursionForRequestBehavior(typeof(AnotherType)));

请注意,您不要删除ThrowingRecursionBehavior因为它将用于保护其他请求,否则StackOverflowException会被抛出。

但是,如果您指定recursionDepth大于 1,则必须删除ThrowingRecursionBehavior并创建一个具有更大或等于的定制的recursionDepth.

public class DepthThrowingRecursionBehavior : ISpecimenBuilderTransformation
{
    private readonly int recursionDepth;

    public DepthThrowingRecursionBehavior(int recursionDepth)
    {
        if (recursionDepth < 1)
            throw new ArgumentOutOfRangeException(
                "recursionDepth",
                "Recursion depth must be greater than 0.");

        this.recursionDepth = recursionDepth;
    }

    public ISpecimenBuilder Transform(ISpecimenBuilder builder)
    {
        if (builder == null)
            throw new ArgumentNullException("builder");

        return new RecursionGuard(
            builder,
            new ThrowingRecursionHandler(),
            recursionDepth);
    }
}
fixture.Behaviors.OfType<ThrowingRecursionBehavior>()
    .ToList()
    .ForEach(b => fixture.Behaviors.Remove(b));
fixture.Behaviors.Add(new DepthThrowingRecursionBehavior(2));
fixture.Behaviors.Add(new OmitOnRecursionForRequestBehavior(typeof(MyType), 2));
fixture.Behaviors.Add(new OmitOnRecursionForRequestBehavior(typeof(AnotherType), 1));
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何为特定类别自定义 AutoFixture 行为 的相关文章

  • JUnit 测试 Spymemcached 客户端

    我有一个类围绕spymemcached 客户端 我想编写一些JUnit 测试来测试getValue 和addKey 方法是否有效 问题是无法从测试服务器访问spymemcached 服务器 所以我想这里需要一些模拟 我的简化类看起来像这样
  • 使用 Jest 模拟延迟() RxJS

    有没有简单的方法来嘲笑delay 例如 带有假时间的可观察对象中的 RxJS 方法 我有这个方法 register user return this checkLog user delay 500 flatMap 当我删除时delay 方法
  • 在 Windows 应用商店应用程序中进行模拟

    我可能不是第一个出于测试目的而在 Windows 商店应用程序中处理模拟的人 我想测试我的 ViewModel 并使用一些模拟框架来模拟它们 当然 所有可用的 通用 框架都不能在 Windows 应用商店应用程序项目中使用 我有一个想法如何
  • 模拟、存根和假对象之间有什么区别[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 尽管有大量资源 但即使在 SO 上 这些 Q A 中也仅对其中两个术语进行了比较 那么 简而言之 它们各自是什么 它们之间有何关系 或者他们根本就没有
  • 检查运行的代码是否为单元测试用例

    我想检查正在运行的代码是否是单元测试用例 或者不为结果执行不同的代码 例如 if unit test case is running do something else do other thing 对此有什么想法吗 这是一个糟糕的方法 您
  • 如何从视图中删除单元测试的“@oidc.login_required”?

    I use 烧瓶样机 questions tagged flask oidc用于用户登录和pytest questions tagged pytest供测试用 对于单元测试 我想 删除 oidc require login 我怎样才能做到这
  • 无法从用法推断方法的类型参数

    namespace TestLibrary TestFixture public class Class1 public delegate T Initializer
  • Rhino Mocks - 使用 Arg.Matches

    我有一个正在嘲笑的函数 它接受一个参数对象作为参数 我想根据对象中的值返回结果 我无法比较对象 因为 Equals 未被覆盖 我有以下代码 tourDal Stub x gt x GetById Arg
  • 在二进制 R 包中包含测试

    我在用testthat为我的 R 包编写单元测试 我见过一些软件包作者 比如来自Rcpp and ggplot2 使用二进制文件分发单元测试 但是 当我使用 RStudio 0 98 1102 构建包时devtools 1 7 0 test
  • 对 git Push 运行单元测试,对 Pull 请求运行集成测试

    在构建 R 包时 我们使用 testthat 来编写测试 我们有 2 个文件 特定包的测试文件 特异性R 我们用它来确保所有包继续一起工作并且总体结果良好 整体R 当前 当我们推送到 github 或通过 Travis 创建 PR 时 都会
  • 如何测试 PARTIAL 视图在 C# ASP .NET MVC 中呈现

    我有一个视图 它内部有部分视图渲染 div class partialViewDiv Html RenderPartial partial Model SomeModelProperty div 和一个返回此视图的控制器 public Ac
  • 我们如何针对 DOM 操作执行单元测试?

    QUnit 的介绍位于netTuts com http net tutsplus com tutorials javascript ajax how to test your javascript code with qunit 关于如何针
  • 您会将什么放入存储库类(数据访问层)的单元测试中?

    我想为我的数据访问层编写一个单元测试 以确保其中的一切正常工作 问题是 我应该把什么样的东西放入测试中 DAL 是静态的Repository隐藏底层 Fluent NHibernate 并通过一个公开的东西向公众公开的类IQueryable
  • Jasmine的spyOn()是否允许执行spies on函数?

    茉莉花有吗spyOn 方法允许执行监视函数 或者确实是这样 当 即将 调用监视方法时拦截调用 并返回true PS 谁能给我解释一下spyOn 的内部运作 Spy 间谍可以伪装成一个函数或一个对象 您可以在编写单元测试代码时使用它们来检查函
  • 单元测试项目无法读取应用程序的App.config

    在运行 Visual Studio Pro 2013 12 0 21005 1 的构建计算机上 我有一个单元测试项目无法正确读取其 App config 文件 如果有的话 以下返回 null System Configuration Con
  • MSTest:如何增加测试时间

    我有一个测试需要运行超过 1 分钟 VS2008 MSTest 测试是从 VisualStudio 启动的 const int TestTimeout 1 TestMethod Timeout 10 60 1000 10 minutes p
  • Xcode 不再识别测试

    我已经解决这个问题几天了 但我没有任何想法 我在 Xcode 中使用单元测试 效果很好 突然 Xcode 不再识别我的测试 如果我进入测试面板 它会显示我的测试为零 我其实有13个 运行单独测试或某些课程的能力现已消失 它不会在编辑器区域的
  • 对一个指令进行单元测试,该指令的模板都是带有脚本标签的文件

    我很难弄清楚如何在我的 Karma 单元测试中包含我的指令模板 全部位于不同脚本标记的一个文件中 我得到的错误 PhantomJS 1 9 Linux ERROR SyntaxError Parse error at var www htm
  • OCMock - 尽管是预期的,但仍调用了意外的方法

    这是经过测试的代码 if MFMailComposeViewController canSendMail MFMailComposeViewController mailComposeController MFMailComposeView
  • 如何将 JUnit 5 与 Gradle 结合使用?

    在成功运行 JUnit 4 测试后 我尝试将 JUnit 5 与 Gradle 一起使用 预期结果 JUnit 4 测试在输出中给出了很好的 通过 结果 并在build reports tests 实际结果 下面的 JUnit 5 测试不输

随机推荐

  • 全局应用程序中的个人名称:存储什么[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 Storing 个人姓名 http en wikipedia org wiki Personal name对于来自许多不同国家的用户使
  • 软件包“pecl.php.net/intl”没有可用的版本

    我正在尝试为 php 安装 intl 当我跑步时sudo pecl install intl它给了我一个错误No releases available for package pecl php net intl 我尝试过清除缓存 也尝试过升
  • 使用 bash 从文本文件中读取字符

    有谁知道如何使用 bash 脚本从文件中读取前两个字符 有问题的文件实际上是一个 I O 驱动程序 其中没有换行符 并且实际上无限长 The read内置支持 n范围 echo Two chars while read n 2 i do e
  • 从 Web 项目中排除 node_modules 目录

    如果我右键单击我的项目并选择 发布 Web 项目 我将收到有关目录名称长度的错误 我已经追踪到了node modules 我想从进程中排除该目录及其内容 我们使用一个 pubxml文件 我尝试添加以下内容之一或以下内容的组合
  • 强制渲染已计算的反应元素

    我正在尝试构建一个闪亮的应用程序 通过不同的 render 函数输出多个结果 问题是其中一个结果需要一些时间来计算 所以我希望shiny能够尽快渲染出快速的结果 这是一些代码来说明 ui R library shiny shinyUI fl
  • C++20 模块导出模板实例化

    我正在创建一个库 并且 C 20 模块内有一个类模板 我想添加一个实例化 以减少使用我的库的每个项目的编译时间 这些不同的实现是否等效 或者是否有更好的方法来实现 1 mod cpp export module mod export tem
  • QProcess未知错误

    我遇到了奇怪的问题 QProcess 只是不工作 并且错误未知 我在标头中有全局变量 QProcess importModule 我得到了这个功能 我尝试了start and startDetached顺便说一句方法 void App op
  • jQuery UI 在搜索之前自动完成显示结果

    我希望在我的项目中在关注自动完成输入之前显示一些初步结果 这些结果应该与自动完成 ajax 请求的结果相同 我可以通过自动完成的标准选项来做到这一点 还是应该编写相同的 JavaScript 代码 您应该设置minLength选项0 如果您
  • 如何使用javascript下载网页[重复]

    这个问题在这里已经有答案了 可能的重复 Javascript 可以读取任何网页的源代码吗 https stackoverflow com questions 680562 can javascript read the source of
  • 打印 C 字符串(UTF-8)时的 NSLog() 与 printf()

    我注意到 如果我尝试使用格式说明符 s 打印包含 UTF 8 字符串表示形式的字节数组 printf 说得对 但是NSLog 得到它乱码 即 每个字节按原样打印 因此例如 被打印为2个字符 这很奇怪 因为我一直认为NSLog 只是print
  • 如何根据条件 $push 字段?

    我试图在 MongoDB 聚合管道的 group 阶段有条件地将字段推入数组 本质上 我有包含用户名的文档以及他们执行的一系列操作 如果我将用户操作分组如下 group id name user name actions push acti
  • rows_merged在compactionhistory中意味着什么?

    当我发出 nodetool compactionhistory I get compacted at bytes in bytes out rows merged 1404936947592 8096 7211 1 3 3 1 什么是 1
  • 允许在 ckeditor 中嵌入 oembed 标签

    我想将 oembed 标签放入 TYPO3 的 ckeditor RTE 中 这样我想将像 Instagram Facebook 或 Twitter 这样的社交帖子放入一些新闻文章中 在一些文本的中间 为此 我激活了 ckeditor 的嵌
  • 快速连续旋转动画不那么连续

    这是我的代码 目的是连续旋转名为 swirls l 的 UIImageView 但是 每次旋转开始 结束之间都会有一个小暂停 我已经浏览了每一个动画教程 但无法弄清楚错误是什么 let fullRotation CGFloat M PI 2
  • 库中是否可以有 SyncAdapter?

    我正在开发一个将由多个应用程序使用的库 图书馆需要进行网络同步 我已经创建了一个存根提供商和帐户 如此处所述 http developer android com training sync adapters index html 问题是
  • MongoDB 查询注释以及用户信息

    我正在使用 nodejs 和 mongod 不是 mongoose 创建一个应用程序 我有一个问题让我头痛了几天 有人请建议一个方法 我有一个像这样的 mongodb 设计 post id ObjectId picture some url
  • Django - 使用 ManyToManyField 进行反向查找

    我正在尝试遵循 django 文档中的代码 class Person models Model name models CharField max length 128 def unicode self return self name c
  • 相当于 float128

    如何使用等效的 float128在Python中 我应该使用什么精度decimal getcontext 我的意思是 精度是以小数位还是位指定的 from decimal import getcontext prec 34 or 128 是
  • 如何在 Selenium Python 中设置 Chrome 的首选项

    我可以如下设置 Firefox 的首选项 set preference profile set preference set preference network http response timeout 30 set preferenc
  • 如何为特定类别自定义 AutoFixture 行为

    我需要启用 AutoFixture 来创建具有循环引用的类型实例 来自第三方提供的 API 为此 我可以删除默认的ThrowingRecursionBehavior如下所示 public class RecursiveObjectCusto