2013-03-11 175 views
3

我使用帶有AutoMoq的AutoFixture。我嘗試創建一個具有getter屬性但沒有setter的類的假實例。我期望AutoFixture配置模擬器,因此即使沒有setter也會返回給定的值。AutoFixture.AutoMoq:將值設置爲只讀屬性

我的代碼是類似的東西:

var data = new List<Data>() { new Data() }; 
var userManager = fixture.Build<IRepository>() 
     //.With(x => x.Data, data) 
     .CreateAnonymous(); 
Mock.Get(userManager).Setup(x => x.Data).Returns(data); 

不幸的是,「有了」,因爲汽車燈具說,數據不具有任何二傳手它爲什麼我設置數值方法不會在這種情況下工作之後直接調用模擬。

有沒有一種方法,自動夾具可以自己做到這一點,所以我不需要最後一行代碼?

編輯:我犯了一個錯誤,代碼示例不起作用。它應該是

var data = new List<Data>() { new Data() }; 
var userManager = fixture.CreateAnonymous<IRepository>(); 
Mock.Get(userManager).Setup(x => x.Data).Returns(data) 

儘管如此,如果將有一個虛假實例的方法會很好。

+0

在某些情況下,你可能想要Moq的'SetupGet'而不是'Setup'(但這不是你的問題)。 FWIW我非常確定AF內置的東西不會處理你要找的東西(這似乎不太適合建立狀態,更多的是可以改變/替換讀取方)。你能否確認你沒有處理那些有明確方法推入狀態的對象(例如通過ctor params?) – 2013-03-11 20:59:31

+0

相關:http://stackoverflow.com/questions/12963019/how-do-i-get-autofixture -automoq-return-results-from-injected-services-in-an – 2013-03-11 21:14:06

回答

2

AutoFixture.AutoMoq doesn't set up your Test Doubles爲你。

如果您想避免在每個測試用例中指定IRepository.Data的設置,可以將設置打包到Customization

public class RepositoryCustomization : ICustomization 
{ 
    public void Customize(IFixture fixture) 
    { 
     fixture.Register(() => 
     { 
      var td = new Mock<IRepository>(); 
      td.SetupGet(r => r.Data).Returns(fixture.CreateMany<Data>()); 
      return td.Object; 
     }); 
    } 
} 

就這樣,下面的測試通過:

[Fact] 
public void AutoProperty() 
{ 
    var fixture = new Fixture().Customize(new RepositoryCustomization()); 
    var repo = fixture.Create<IRepository>(); 
    Assert.NotEmpty(repo.Data); 
} 

在理論上有可能編寫自動代碼反映通過一個接口的成員,並建立一個返回值的每個成員,但IMO,這永遠不應該是AutoFixture.AutoMoq的默認行爲。

+0

實際上,我想增強「With」方法。但如果不可能,這不是問題。謝謝您的回答。 – 2013-03-14 10:21:41

+0

您想用哪種方式來增強'With'方法。它缺少什麼? – 2013-03-14 11:41:08

+1

@MarkSeemann我相信他是說默認情況很好,但最好是有類似於'.With(x => x.Data,data)'的東西,就好像它分配給那個特定的屬性沒有setter(使用AutoMoq時)。 – 2013-07-03 22:54:51