2017-04-20 50 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向模擬庫請求接口和抽象類來實現自動嘲諷功能。