Autofixture构造函数注入延迟加载

2024-03-13

我在单元测试中使用自动装置,它作为自动模拟器的工作方式非常棒。

但是,当我将延迟加载的对象注入到我的类中时,我遇到了问题。例如:

public class MyClass : IMyClass
{
    private Lazy<IMyInjectedClass> _myInjectedClassLazy;
    private IMyInjectedClass _myInjectedClass {
        get { return _myInjectedClassLazy.Value; }
    }

    public MyClass(Lazy<IMyInjectedClass> injectedClass)
    {
        _myInjectedClassLazy = _myInjectedClass;
    }

    public void DoSomething()
    {
        _myInjectedClass.DoSomething();
    }
}

然后,当我尝试运行测试时,我使用 autofixture 来生成类,如下所示:

public class MyTests
{
    [Test]
    public void ShouldDoSomething()
    {
        var fixture = new Fixture().Customize(new AutoMoqCustomization());
        fixture.Behaviors.Remove(new ThrowingRecursionBehavior());
        fixture.Behaviors.Add(new OmitOnRecursionBehavior());

        var mockMyClass = fixture.Freeze<Mock<IMyClass>>();

        var sut = fixture.Create<MyClass>();

        sut.DoSomething();
    }
}

但这段代码会抛出以下错误:

System.MissingMemberException :延迟初始化类型没有公共的无参数构造函数。

有没有办法可以避免此错误并在使用自动固定装置时注入惰性对象?


FWIW,虽然我不同意这样做的动机,但你可以告诉 AutoFixture 如何创建一个实例Lazy<IMyInjectedClass>:

var fixture = new Fixture().Customize(new AutoMoqCustomization());
fixture.Behaviors.Remove(new ThrowingRecursionBehavior());
fixture.Behaviors.Add(new OmitOnRecursionBehavior());
fixture.Register(                                                   // Add this 
    (IMyInjectedClass x) => new Lazy<IMyInjectedClass>(() => x));   // to pass

var mockMyClass = fixture.Freeze<Mock<IMyClass>>();

var sut = fixture.Create<MyClass>();

sut.DoSomething();

如果您需要重复执行此操作,您应该考虑将其包装在自定义中 http://blog.ploeh.dk/2011/03/18/EncapsulatingAutoFixtureCustomizations.

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

Autofixture构造函数注入延迟加载 的相关文章

随机推荐

  • 如何在 SQL Server 中一次更改多个列

    我需要ALTER表中几列的数据类型 对于单列 以下工作正常 ALTER TABLE tblcommodityOHLC ALTER COLUMN CC CommodityContractID NUMERIC 18 0 但是如何更改一个语句中的
  • 使用 JavaScript 在画布中操作图像亮度

    我想更改图像的亮度 我有一个大项目 下面是一个最小的可重现示例 我添加了这一行来检测对象中的 ID 并将亮度分配给图像属性 for let j 0 j lt imageOverlay length j if id imageOverlay
  • Rails simple_form label_html

    我想覆盖一种表单上的输入与其标签之间的边距 可以通过 label html gt 来完成吗 github 上的示例显示了 class gt special 被传递 我需要在 css 文件中设置一些内容吗 如果是这样 我该怎么做 也就是说 我
  • 如何从仅一个月前的Firestore中获取文档

    我正在执行查询以仅获取 1 个月前的文档 我存储文档本身的创建时间 timestamp 9 Apr 2020 10 03 43 AM 现在 在我的查询中 我想获取当月的所有文档 但我不想使用客户端的 currentDate 因此无法更改 但
  • C# 是否支持绑定方法或方法闭包(特殊闭包允许 this 始终指向实例)

    Adobe有非常明确的解释here http help adobe com en US ActionScript 3 0 ProgrammingAS3 WS5b3ccc516d4fbf351e63e3d118a9b90204 7f30 ht
  • JS DOM createElements 和appendChild 不起作用

    我正在尝试创建一个包含一些学生信息的网站 因此 我需要创建动态配置文件卡并将它们附加到正文中 但 DOM 总是让我着迷 function student src name this src src this name name var st
  • 具有两种纯色的矩形形状

    我想创建一个具有两种纯色 水平 的矩形形状以实现如下所示 我听说过layer list 我虽然可以用它来包含两个不同颜色的矩形 但它似乎只能垂直放置形状 有没有办法使用 lalyer list 来实现这一点 或者我应该使用完全不同的东西 我
  • iPad 标题栏。导航栏还是工具栏?

    我看到很多 iPad 应用程序都有很酷的标题栏 这些似乎是导航栏和工具栏的组合 它们通常有一个后退按钮和一个标题以及其他按钮 导航栏仅支持左侧项目 右侧项目和标题视图 而且工具栏并不真正支持后退按钮或标题 那么 如何在 UINavigati
  • java servlet 中出现令人惊讶的结果

    我在 java servlet 中得到了令人惊讶的结果 我将输入参数 日期 从 jsp 传递到 servlet 如下所示
  • 由于文件路径中有特殊字符,OpenCv imwrite 不起作用

    当文件路径具有特殊字符 例如 时 我无法保存图像 这是来自 Python 3 shell 的测试 gt gt gt cv2 imwrite gel test jpg frame True gt gt gt cv2 imwrite gel t
  • 如何在 C 中打印“off_t”? [复制]

    这个问题在这里已经有答案了 可能的重复 我应该如何打印像off t和size t这样的类型 https stackoverflow com questions 586928 how should i print types like off
  • 如何告诉 git 显示我在上次提交中所做的更改的差异? [复制]

    这个问题在这里已经有答案了 With git 如何查看上次提交的更改 我的意思是我想看到我的最后一次提交和之前的提交之间的差异 我知道我可以在 Github 浏览器上看到它 但我想在终端上的本地提交历史记录中看到它 我知道我可以在提交之间进
  • 无法为 android 中的微调器设置 OnItemClickListener

    在定制的RecyclerView Adapter
  • 如何生成随机概率分布 julia

    我在字典中有一个键列表 我想为每个项目分配一个 0 到 1 之间的数字 使分配的数字总和为 1 如何做到这一点 我尝试使用 rand 进行一些操作 但没有成功 有什么建议么 更数学的答案是使用狄利克雷分布 https en wikipedi
  • 类组件的 useEffect 替代品

    我刚刚了解到在功能组件中我可以使用useEffect留意任何副作用 例如 使用时localStorage 这确保我的状态与效果挂钩 我想在我的基于类的组件中具有类似的功能localStorage 我怎样才能确保我的状态在发生任何变化时立即更
  • 从 Java 应用程序即时打开 PDF 文件

    有没有办法让代码以独立于平台的方式在Java应用程序中打开PDF文件 我的意思是在 Windows 中使用批处理文件可以做到这一点 有没有其他方法可以使用独立于平台的代码来动态打开 PDF 文件 I d try Desktop open F
  • 使用 Linq + Include 排序

    我与两个实体有一对多关系 Order int OrderId string OrderNumber OrderItem int ItemId int sequence Product int ProductId string Product
  • 使用带有 SL 和 TP 的 CCXT 使用 Python 在 FTX 上创建市场订单

    有人有如何创建带有止盈和止损的市价订单的示例吗 我已经阅读了文档 因为这是我第一次做这样的事情 所以我真的不明白 我正在尝试创建一个 API 端点 该端点接收来自 TradingView 的警报并下订单 我真的不想使用限价订单 因为我只想以
  • Oracle - 带有可选参数的索引使用

    我使用以下技巧来索引具有一些空值的列 create index xx people idx1 on xx people id number 1 这很好用 遗憾的是 当您使用可选参数时 这并没有帮助 select from xx people
  • Autofixture构造函数注入延迟加载

    我在单元测试中使用自动装置 它作为自动模拟器的工作方式非常棒 但是 当我将延迟加载的对象注入到我的类中时 我遇到了问题 例如 public class MyClass IMyClass private Lazy