2017-04-20 100 views
1

我希望有人能给我一些想法。AutoFixture AutoMoq将一个模拟对象作为接口投入

我需要创建一个嘲笑对象满足以下:

  1. 它实现了接口IEntity。
  2. 它使用我已经在EntityBase中的基础实现。
  3. 使用AutoFixture自动生成属性。

我尝试了好几种方案,我用这个代码结束:

fixture.Customize(new AutoConfiguredMoqCustomization()); 
 

 
fixture.Customize<IEntity>(c => c.FromFactory(
 
() => fixture.Create<Mock<EntityBase>>().As<IEntity>().Object));

不过,我得到以下异常:

模拟类型已经被初始化访问其对象属性。添加接口必须在此之前完成。 :(

回答

2

你可以使用一个TypeRelay告诉AutoFixture对于IEntity请求应通过创建实例满足的EntityBase:现在

fixture.Customizations.Insert(0, new TypeRelay(typeof(IEntity), typeof(EntityBase))); 

,每AutoFixture有时间来创造的IEntity一个实例,这反而创建EntityBase,反过来,会起订量由于处理到AutoConfiguredMoqCustomization一个实例。

继电器是非常方便和有a few of them内置。事实上,它们使整个通过relaying向模拟库请求接口和抽象类来实现自动嘲讽功能。