【问题标题】:Property Injection with AutoFixture使用 AutoFixture 进行属性注入
【发布时间】:2013-09-13 08:06:35
【问题描述】:

我已经与以下问题斗争了一天左右。尽管使用 AutoFixture 多年,但我无法解决这个问题。

我有一个抽象类:

public abstract class AbstractClass 
{
   public IChildClass Child {get; set;}
};

IChildInterface:

public interface IChildClass
{
   string Name {get; set;}
}

接口的实现:

public class ChildClass : IChildClass
{
   public string Name {get; set;}
}

然后我有一个抽象类的派生类:

public class MyClass : AbstractClass
{
   public MyClass()
   {
      Initialize();
   }

   private void Initialize()
   {
      var nameOfChild = Child.Name;
   }
}

在 MyClass 的单元测试中,我执行以下操作:

var fixture = new Fixture().Customize(new AutoMoqCustomization());

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

但是在 Child.Name 上获得 NullReferenceException。我已经尝试对 IChildClass 和 AbstractClass 使用注册和自定义,但没有运气。在这种情况下,即使是 ISpecimenBuilder 的自定义实现也无济于事。

有没有人知道如何解决这个问题?

【问题讨论】:

  • 如果您暂时忘记 AutoFixture,您希望它如何工作?
  • 我的意思是:您是否真的尝试过来编译和运行这里提供的代码? AFAICT,它永远不可能工作。
  • 这怎么可能?在构造函数执行之前不可能分配属性。 Unity 代码会是什么样子?
  • 这有什么不同? MyClass 构造函数正在尝试读取 Child 属性,此时该属性尚未初始化...当然它会抛出 NullReferenceException
  • 我不想在这里做个聪明人;我想帮忙,但除非我错过了什么,否则我看不出你怎么能指望这会奏效。我将您的所有代码复制到 VS 中,并尝试创建 MyClass 的实例,但正如预期的那样,它会引发异常。可能只是我在这里非常无聊,但我看不出它如何像这里介绍的那样工作。不管你使用new、AutoFixture 还是 Unity...

标签: autofixture


【解决方案1】:

上面的代码永远不会工作,因为 Initialize 在 Ctor 中被调用。 Autofixture 正在初始化对象,并且该属性尚未被注入。上面有几种解决方法,但就目前而言...... Child 在 Initialize 方法中将始终为 null。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多