9

test verileri oluşturmak için, Oluşturucu desen aşağıdaki türevi kullanın (basitleştirilmiş bir örnek!):Başka bir sınıfa dayalı kod nasıl oluşturulur?

Numune sınıfı:

public class Person 
{ 
    public string Name { get; set; } 
    public string Country { get; set; } 
} 

oluşturucu:

public class PersonBuilder 
{ 
    private string name; 
    private string country; 

    public PersonBuilder() 
    { 
     SetDefaultValues(); 
    } 

    private void SetDefaultValues() 
    { 
     name = "TODO"; 
     country = "TODO"; 
    } 

    public Person Build() 
    { 
     return new Person 
        { 
         Name = name, 
         Country = country 
        }; 
    } 

    public PersonBuilder WithName(string name) 
    { 
     this.name = name;    
     return this; 
    } 

    public PersonBuilder WithCountry(string country) 
    { 
     this.country = country; 
     return this; 
    } 
} 

NOT: Örneğin kendi içeriği uygun değildir. Burada önemli olan, örnekte, PersonBuilder gibi bir kurucu sınıfın, varlık sınıfına (Kişi) bakarak ve aynı modeli uygulayarak tamamen nasıl oluşturulabileceğidir - aşağıya bakınız.

Şimdi, kişi sınıfının 2 yerine 15 mülk olduğunu düşünün. Kurucu sınıfı uygulamak için bazı maymun işçiliği alırken, teorik olarak, Kişi sınıfından otomatik olarak üretilebilir. Oluşturucu sınıfını hızlı bir şekilde kurmak için kod oluşturmayı kullanabilir ve gerekirse daha sonra özel kod ekleyebiliriz.

Kod oluşturma işlemi bağlamdan haberdar olmalıdır (kişinin sınıfının adı ve özellikleri), bu nedenle basit metin tabanlı kod oluşturma veya normal ifade sihirleri burada tam olarak hissetmez. Dinamik, metin tabanlı olmayan ve görsel stüdyondan hızlı bir şekilde tetiklenebilen bir çözüm tercih edilir.

Böyle bir senaryo için kod oluşturma işlemini gerçekleştirmenin en iyi yolunu arıyorum. Yansıma? Codesmith? T4 şablonları? Makrolar ile canlı şablonlar yeniden paylaşın mı?

Ben bazı büyük yanıtlar :)

cevap

2

T4 çözümü iyi Visual Studio tümleşik seçenektir görmek için sabırsızlanıyorum. Kodu oluşturmak için T4 şablonunun içindeki yansımayı kullanabilirsiniz. sadece test için ise

0

, RhinoMocks gibi alaycı bir çerçeve düşünün:

internal class PersonBuilder 
{ 
    private MockRepository _mockRepository; 
    private IPerson _person; 

    public PersonBuilder() 
    { 
     _mockRepository = new MockRepository(); 
     _person = _mockRepository.Stub<IPerson>(); 
    } 

    public PersonBuilder WithName(string name) 
    { 
     _person.Name = name; 
     return this; 
    } 

    public PersonBuilder WithCountry(string Country) 
    { 
     _person.Country= Country; 
     return this; 
    } 

    public IPerson Build() 
    { 
     _mockRepository.ReplayAll(); 
     return _person; 
    } 

} 

sizin oluşturucu sizin ihtiyacı ile birlikte gelişmeye Bu şekilde. Ayrıca, Build yönteminizi değiştirmeniz gerekmez. Sadece "WithX" yöntemlerini ekleyin.

+0

Ünite testlerimizde çokça alaylı bir şekilde kullanıyoruz, ancak bunun için alay kullanmamayı hiç düşünmemiştim :). Bu problemi çözmek için harika bir yol olacağını düşünüyorum, ama sadece testlerden daha geniş bir kapsamı olan genel soru değil. Ama yine de bu cevap için çok teşekkürler! –

2

CodeSmith Generator 5.x numaralı belgede, varolan kodu kullanmanıza olanak veren bir özellik ekledik. Lütfen documentation here'a bir bakın. Ayrıca bir CodeSmith Generator Şablonunda yansımayı veya herhangi bir .NET kütüphanesini kullanabilirsiniz.

Teşekkür -Blake Niemyjski

0

ABSE modelleme yaklaşımı ve IDE, AtomWeaver içine bakın. ABSE, bir modelin (UML veya MDA ile ilgisi olmayan) "yapı taşları" (Atomlar) uygulanarak oluşturulduğu şablon tabanlı bir modelleme ve kod oluşturma çerçevesidir. Bu Atomlar, şablon/program melezleridir ve içeriğe duyarlıdır: Bir Atom, ağacın üzerine yerleştirilmesine ve belirli Atomların varlığına/yokluğuna göre kod üretebilir.

Model ana bilgisayarı (bu örnekte AtomWeaver) istenen kaynak kodunu elde etmek için modeli "yürütür". Model "kaynak" olabilir: modeli değiştirmek ve gerektiği kadar yeniden üretmek.

AtomWeaver, Visual Studio'ya entegre edilmez, ancak sorunsuz bir şekilde herhangi bir sorun olmadan çalışabilir.

İlgili konular