2008-12-11 13 views
284

yapıyor ben birim test yeniyim ve ben 'iç' erişim değiştiricisinin fazlasını kullanarak başlamalı olmadığını anlamaya çalışıyorum. Bence 'iç' kullanmak ve montaj değişkeni 'InternalsVisibleTo' ayarlarsanız, biz test projesinden halkı beyan etmek istemiyorum fonksiyonlarını test biliyorum. Bu bana her zaman 'dahili' kullanmam gerektiğini düşünmemi sağlıyor, çünkü en azından her projenin (test yapmalı) kendi test projesi var. Bunu yapmamam için bana bir neden söyleyebilir misiniz? Ne zaman 'özel' kullanmalıyım?C# "iç" erişim değiştirici birim test

+0

değer söz - Sık sık() 'yöntemlerle kendilerinde' System.Diagnostics.Debug.Assert kullanarak iç test yöntemleri biriminin ihtiyacını önleyebilirsiniz. –

cevap

867

İç sınıflar test edilmeye ihtiyacı ve bir Assemby niteliği vardır:

using System.Runtime.CompilerServices; 

[assembly:InternalsVisibleTo("MyTests")] 

proje bilgisi dosyası, mesela bu ekle Properties\AssemblyInfo.cs.

+2

Bunu test projesine veya test edilen projeye ekledim!?!? – akuhn

+53

Bunu test edilen projeye ekleyin (ör., Properties \ AssemblyInfo.cs). "Testlerim" test meclisi olurdu. – EricSchaefer

+78

Bu gerçekten kabul edilen cevap olmalı. Seni bilmiyorum çocuklar, ama testler koddan "çok uzak" olduklarında test ettikleri için sinirleniyorum. Ben 'özel' olarak işaretlenmiş herhangi bir şeyi test etmekten kaçınıyorum, ama çok fazla 'özel' şey çok iyi çıkarılmaya çalışılan bir 'iç' sınıfa işaret edebilir. TDD veya yok TDD, çok fazla kodu test eden daha fazla test yapmayı tercih ediyorum, aynı miktarda kodu kullanan çok az test var. Ve 'dahili' şeyleri test etmekten kaçınmak, iyi bir oran elde etmek için tam olarak yardımcı olmaz. –

8

Sen özel yanı kullanabilir ve yansıma ile özel yöntemleri çağırabilir. Visual Studio Team Suite'i kullanıyorsanız, sizin için özel yöntemlerinizi çağırmak için bir proxy oluşturacak bazı güzel işlevlere sahiptir. Özel ile

kullanmanız gereken değiştirici hangi erişim açısından

http://www.codeproject.com/KB/cs/testnonpublicmembers.aspx

, başparmak benim genel kural başlatmak: Burada birim test özel ve korunan yöntemlere işi kendiniz yapabilirsiniz gösteren bir kod projesi makale ve gerektiğinde yükseltin. Bu şekilde, sınıfınızın iç detaylarının çok azını gerçekten ihtiyaç duyduğunuz şekilde ortaya çıkaracak ve uygulama ayrıntılarını gerektiği gibi gizlemeye yardımcı olacaksınız.

93

Özel yöntemleri sınamak isterseniz, PrivateObject ve PrivateType adresindeki Microsoft.VisualStudio.TestTools.UnitTesting ad boşluğuna bakın. Gerekli yansıma kodları etrafındaki sargılar için kolay kullanım sunarlar.

Dokümanlar: PrivateType varsayılan olarak gizli kullanılarak PrivateObject

+6

Oy kullanımda iken lütfen yorum bırakın. Teşekkürler. –

+26

Bu cevaptan aşağı aptal oylama. Daha önce belirtilmeyen yeni bir çözüm ve gerçekten iyi bir noktaya işaret ediyor. –

8

Tut. Eğer bir üye bu türün ötesine maruz kalmamalıysa, aynı projenin içinde bile olsa bu türün ötesine maruz bırakılmamalıdır. Bu, işleri daha güvenli ve daha düzenli tutar - nesneyi kullanırken, kullanmanız için hangi yöntemleri kullanacağınız daha açık olur.

, ben bazen deneme amaçlı doğal özel yöntemler iç sunmak için makul olduğunu düşünüyorum olduğunu söyledi. Bunu refactoring-unfriendly olan yansımayı kullanmayı tercih ederim. Bir "ForTest" eki olabileceğini dikkate almak

Bir şey: Aynı proje içinde sınıf kullanıyorsunuz Sonra

internal void DoThisForTest(string name) 
{ 
    DoThis(name); 
} 

private void DoThis(string name) 
{ 
    // Real implementation 
} 

, bu (şimdi ve gelecekte) aşikar olduğunu yapmamalısın Gerçekten bu yöntemi kullanıyor - sadece test amaçlı var. Bu biraz hacky, ve kendim yaptığım bir şey değil, ama en azından dikkate değer.

+1

Eğer yöntem dahili ise, bu, test tertibatından kullanımını engellemez mi? –

+0

@Ralph: InternalsVisibleTo kullanılmıyor. –

+3

Bazen 'ForTest' yaklaşım kullanmak ama hep ölü çirkin (üretim iş mantığı açısından hiçbir gerçek değer sağlar ekleyerek kodu) bulabilirsiniz. Genellikle yaklaşımı kullanmak zorunda kaldım çünkü tasarım biraz talihsiz bir durumdur (örn.testler arasında tekil örneklerini sıfırlamak zorunda kalıyor) – ChrisWue