2013-07-15 7 views
20

baz sınıflarında [SetUp]:NUnit ve ben içeren bir temel sınıftan bir [SetUp] özelliğini devralır NUnit kullanarak bazı test kodu bakıyorum

public class BaseClass 
{ 
    [SetUp] 
    public void SetUp() 
    { 
    //do something 
    } 

} 

[TestFixture] 
public class DerivedClass : BaseClass 
{ 
    [SetUp] 
    public void SetUp() 
    { 

    //do something else, with no call to base.SetUp() 
    } 
    //tests run down here. 
    //[Test] 
    //[Test] 
    //etc 
} 

türetilmiş sınıf kesinlikle çok çaba gereklidir Temel sınıf 'SetUp() yönteminde yapılır.

bir şey eksik veya türetilen sınıfın testler çalıştırıldığında temel sınıfta SetUp() yöntemi değil çağrılır? Biri diğerinden önce çağrılacak olan [SetUp] özelliği ile özel bir şey var mı?

+0

Bu sorunla uğraşan herkes için başka bir ipucu: 'SetUp' yöntemlerinin genel olduğundan emin olun. R #, eğer onlar özelse seni uyarmaz ama koşmazlar. – lex82

+0

NUnit 2.5+ için güncel cevap burada: http://stackoverflow.com/a/22099351/532647 –

cevap

22

yılında gerekçesini dikkate almalıdır.

bir TestFixture tek SetUp yöntemi olabilir. Birden fazla tanımlanırsa TestFixture başarıyla derlenir, ancak testleri çalışmaz.

Eğer bir çocuk sınıfta ek kurulum mantığı eklemek için üst sınıfında sanal olarak SetUp işaretlemek, bunu geçersiz ve temel sınıfın kurulumu çalıştırmak istiyorsanız base.SetUp() aramanız gerekirse

http://www.nunit.org/index.php?p=setup&r=2.2.10 de .

public class BaseClass 
{ 
    [SetUp] 
    public virtual void SetUp() 
    { 
    //do something 
    } 

} 



[TestFixture] 
public class DerivedClass : BaseClass 
{ 
    public override void SetUp() 
    { 
    base.SetUp(); //Call this when you want the parent class's SetUp to run, or omit it all together if you don't want it. 
    //do something else, with no call to base.SetUp() 
    } 
    //tests run down here. 
    //[Test] 
    //[Test] 
    //etc 
} 
+0

Teşekkürler. Yani yukarıdaki kodun yanlış olması ve temel SetUp() yöntemi çağrılmayacak mı? – larryq

+0

@larryq Sorunuzdaki kod geçersizdir, çünkü [SetUp] özelliğine sahip miras zincirinde iki yönteminiz vardır. Düzeltme yalnızca SetUp ile bir yönteme sahip olmak ve gerektiğinde bunu geçersiz kılmaktır. – vcsjones

+0

Ben de öyle düşündüm, teşekkürler. (Yukarıdaki kod üzerinde çalıştığım bir projeden yapıştırılmıştı ve bir şeyleri kaçırıp kaçırmadığımı merak ettim.) – larryq

1

Oluşturucular arkadaşlarınızdır.

Eğer bir katkı kurulum davranışı istiyorsanız - kendi sözdizimi bunun için daha fazla sezgisel olarak, kurucular kullanın.

Ayrıca, aynı zamanda Yalnızca bir SetUp yöntemi olabilir http://jamesnewkirk.typepad.com/posts/2007/09/why-you-should-.html

+1

Bu çok kapsamlı bir cevap değil. Kurucular bu sorunu nasıl çözecek? – vcsjones

+0

Yapıcıları olabildiğince hafif tutmayı tercih ediyorum, böylece nesneyi oluştururken havaya uçurma riskiyle karşı karşıya kalmıyorsunuz. – tsells

+0

"Prodüksiyon" derslerine katılıyorum, ama unutmayın - testler FAILYIZ. Eğer c-tor'da veya başka türlü bir istisna alırsam - bu beni nasıl etkiler? – Arielr

43

NUnit 2.5'ten önceki önceki cevaplar doğru; Bir test için sadece tek bir [SetUp] özniteliğine sahip olabilirsiniz. NUnit 2.5 ile

itibaren size [SetUp] özniteliği ile dekore birden fazla yöntem olabilir. Bu nedenle aşağıda 2.5 + NUnit mükemmel geçerlidir:

public abstract class BaseClass 
{ 
    [SetUp] 
    public void BaseSetUp() 
    { 
     Debug.WriteLine("BaseSetUp Called") 
    } 
} 

[TestFixture] 
public class DerivedClass : BaseClass 
{ 
    [SetUp] 
    public void DerivedSetup() 
    { 
     Debug.WriteLine("DerivedSetup Called") 
    } 

    [Test] 
    public void SampleTest() 
    { 
     /* Will output 
     * BaseSetUp Called 
     * DerivedSetup Called 
     */ 
    } 
} 

NUnit her zaman ilk taban sınıfta '[SetUp]' yöntemini çalışacaktır miras

. Birden fazla [SetUp] yöntemi, tek bir sınıfta bildirilmişse, NUnit, yürütme sırasını garanti edemez.

See here for further information.