【问题标题】:Autofixture Constructer injection lazy loadingAutofixture 构造函数注入延迟加载
【发布时间】:2013-08-19 06:54:05
【问题描述】:

我在我的单元测试中使用了 autofixture,它作为 automocker 的工作方式非常棒。

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

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 : 延迟初始化的类型没有公共的无参数构造函数。

有没有办法在使用 autofixture 时避免此错误并注入惰性对象?

【问题讨论】:

  • 为什么要注入Lazy&lt;IMyInjectedClass&gt;?注入IMyInjectedClass 会更简单更好。
  • 原因是为了让对象图更小,在我注入惰性对象之前,依赖注入需要很长时间才能初始化,因为必须创建大对象图。当他们懒惰时,初始启动会更快,因为图要小得多,因为图的每个部分只需要在需要时构建。
  • 这是一个泄漏的抽象,对此有更好的解决方案:blog.ploeh.dk/2011/03/04/Composeobjectgraphswithconfidence

标签: c# unit-testing autofixture


【解决方案1】:

FWIW,虽然我不同意这样做的动机,但您可以告诉 AutoFixture 如何创建 Lazy&lt;IMyInjectedClass&gt; 的实例:

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();

如果你需要反复这样做,你应该考虑packaging this in a Customization

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-27
    • 1970-01-01
    • 1970-01-01
    • 2012-04-12
    • 1970-01-01
    • 2015-07-03
    • 1970-01-01
    相关资源
    最近更新 更多