2012-10-29 18 views
5

XUnit'in teorileriyle birleştiğinde AutoFixture'un gücünü takdir ediyorum. Kısa bir süre önce encapsulating customizations'un kullanımını benimsedim ve testlerimi bir özellik aracılığıyla sağladım.Özel teori veri özniteliğim AutoFixture için oluşturduğum armatürü nasıl değiştirebilirim?

Bazı durumlarda, sınamayı yürütmek için bir kerelik bir senaryoya ihtiyacım var. Yukarıdaki gibi bir AutoDomainDataAttribute kullandığımda, bir IFixture isteyebilir ve öznitelik tarafından oluşturulan aynı örneği almayı bekleyebilir miyim?

Benim senaryoda, koleksiyonlar vb. Için varsayılan olarak MultipleCustomization kullanıyorum. Ancak, bu durumda, SUT yapıcımdan yalnızca bir öğenin gönderilmesini istiyorum. Yani, şöyle benim test yöntemi tanımladığınız:

[Theory, AutoDomainData] 
public void SomeTest(IFixture fixture) { 
    fixture.RepeatCount = 1; 
    var sut = fixture.CreateAnonymous<Product>(); 
    ... 
} 

anonim Ürün oluştururken Ne yazık ki, bir özel durum alıyorum. Diğer testler, bir Ürünü bu niteliklere sahip bir yöntem parametresi olarak sorarsam, gayet iyi çalışır. Bu özel durumda sadece bir sorun var, bu noktada fikstür parametresinin AutoDomainDataAttribute'im tarafından oluşturulanla aynı olduğunu umuyorum.

Ürünün yapıcısı, AutoDomainData aracılığıyla yerinde sahip olduğum özelleştirmeler nedeniyle normalde 3 öğe ile doldurulacak bir IEnumerable bekler. Şu anda, benim DomainCustomization o sırayla, Çoklu Özelleştirme ve AutMoqCustomization oluşan bir CompositeCustomization olduğunu.

Kural dışı durum şöyledir: "InvalidCastException: 'Product' yazabilmek için 'Castle.Proxies.ObjectProxy' türünde nesne yazılamıyor." Eğer Özellikte aktif aynı Armatür örneğini gerekiyorsa

cevap

7

, böyle bir Özelleştirme'de kendisi içine Fikstürü enjekte edebilir

public class InjectFixtureIntoItself : ICustomization 
{ 
    public void Customize(IFixture fixture) 
    { 
     fixture.Inject(fixture); 
    } 
} 

Hemen önce CompositeCustomization bu eklemeyi unutmayın AutoMoqÖzelleştirme, IFixture bir arabirim olduğundan ve AutoMoqCustomization ilk önce gelirse, bunun yerine bir Mock örneği alırsınız - AFAICT, şu an dinamik Kale proxy'si ile gerçekleşiyor. Bazen ... Bana öyle geliyor

[Fact] 
public void SomeTest() 
{ 
    var fixture = new Fixture().Customize(new DomainCustomization()); 
    fixture.RepeatCount = 1; 
    var sut = fixture.CreateAnonymous<Product>(); 
    // ... 
} 

çok daha kolay olması için: Eğer gerçekten bir Armatür örneğini gerekiyorsa


Ancak, neden sadece düzenli, zorunlu test metodu yazmak değil kendimi Hala ... çok


bunu, sana ifade farklı bir şekilde API veya test durumda bütün mesele gitmesini yapmamaya eğer merak ediyorum. Ben çok nadiren bu günlerde RepeatCount mülkünü manipüle etmem gerektiğini anladım, bu yüzden neden bunu yapmak istersiniz?

Muhtemelen ayrı bir Yığın Taşması sorusunun konusu bu olsa da ...

+0

Teşekkür ederim, Mark. Hemen buraya yazdıktan sonra zorunlu test yaklaşımına geçtim. Yine de alternatifi bilmek güzel. Son olarak, benim özel testim son kategorinin üründen kaldırılamamasını sağlıyor (en az bir tane olmalı). Bu, RepeatCount'u da kontrol etmek için ihtiyacım olan tek zamandır. Tekrar teşekkürler! – ventaur

+0

Sadece Kategoriler kaldırılmamış olabilir.Sayım() - 1 'öğelerini test ayarlarınızın bir parçası olarak ilk olarak test ettikten sonra, sadece bir tane sola, sonuncuyu kaldıramayacağınızı test ettik. –

+0

Evet, sanırım öyle. Programcılar bazen karmaşık şeylerin üstesinden gelirler. :-) – ventaur

İlgili konular