2014-12-02 19 views
11

Bazı sınıflar böyle biraz görünebilir bir iç içe geçmiş çok nesne modelini vardır:AutoFixture'a, her zaman bir TBase'i başlattığında TDerived oluşturması için nasıl söyleyebilirim?

class TBase { ... } 

class TDerived : TBase { ... } 

class Container 
{ 
    ICollection<TBase> instances; 
    ... 
} 

class TopLevel 
{ 
    Container container1; 
    Container container2; 
    ... 
} 

Ben bir test fikstür olarak benim üst düzey nesne oluşturmak istiyorum, ama tüm TBase istiyorum örnekleri (örneğin, instances koleksiyonunda olduğu gibi) TBase yerine TDerived örneğidir.

ben gibi bu oldukça basit kullanarak bir şey yapabileceğini düşündüm:

var fixture = new Fixture(); 

fixture.Customize<TBase>(c => c.Create<TDerived>()); 

var model = this.fixture.Create<TopLevel>(); 

... ama Customize yılında lambda ifadesi yanlıştır çünkü, çalışmıyor. Sanırım bunu yapmanın bir yolu var, ama AutoFixture, geliştiricinin blogunda bir bilinç akışı dışında, belgelere sahip değil gibi görünüyor.

Beni doğru yöne yönlendiren var mı?

cevap

8

dcastro tarafından cevap da bir seçenek olmakla birlikte, güvenli seçenek TypeRelay sınıf kullanmaktır.

fixture.Customizations.Add(
    new TypeRelay(
     typeof(TBase), 
     typeof(TDerived)); 
+1

Teşekkürler. Bunu belgeledim diliyorum ... :-) –

+0

Bu: http://www.nudoq.org/#!/Packages/AutoFixture/Ploeh.AutoFixture/TypeRelay :) –

+0

Yani, "belgeler": " Türü için bir istekte bulunan "için bir istekte bulunur", aslında bu işe yaramaz bir ses çıkarmaz :-) Ama benim daha geniş olan nokta, nereye bakacağınızı bilmediğiniz sürece bu yetersiz bilgiyi bile bulmanın bir yolu olmamasıdır. veya tüm API'yi okuyun - nasıl yazılacağını bilmediğiniz bir kelimeye bakmak için bir sözlük kullanmak gibidir. Daha eksiksiz bir eğitici veya hile sayfası olması gerekir, aksi takdirde potansiyel kullanıcı tabanınızın% 99'u ilk engelde ortadan kaldırılır, ki bu da açıkça girilen çaba miktarı göz önüne alındığında gerçek bir utanç olacaktır. –

7

Otomatik Düzeltme'ye belirli bir türdeki örneklerin nasıl oluşturulduğunu anlatmak için Register yöntemini kullanın. @sgnsajgon tarafından işaret edildiği gibi

fixture.Register<TBase>(() => new TDerived()); 

ya,:

fixture.Register<TBase>(fixture.Create<TDerived>); 
+2

Ayrıca yazabilirsiniz: fixture.Register (fixture.Create ); – sgnsajgon

+0

@sgnsajgon Güzel, bunu cevaba ekledim :) – dcastro

+0

Teşekkürler, işe yaradı. +1. Ancak, Mark Seemann ile tartışmak zor, bu yüzden onun "daha doğru" cevabını kabul ettim. –