2009-07-31 18 views
16

Visual-Studio 2008 yolunu ünite testine atlıyorum ve test amacıyla çapraz montaj class erişimini başarmanın en iyi yolunun ne olduğunu merak ediyorum.Birim sınama amacıyla başka bir derleme sınıflarına nasıl erişilir?

Temelde, tek bir çözümde iki proje var:

  1. Projem (C#)
  2. MyProjectTests (C# Test Projesi)

MyProject her şey şu anda sahip varsayılan erişilebilirlik, hangi eğer ben Doğru hatırlama, her şeyin etkili bir şekilde internal anlamına geldiği anlamına gelir. Ben çoğunlukla class düzeyinde test etmek için arıyorum, ancak birkaç delegates dahil.

Muhtemelen gelecekte bir dış API olacağız, ancak tamamlanma özelliğinin yaklaşık% 20'sini (en azından kağıt üzerinde) yaşıyorum ve bunun üzerine daha fazla kod katmanın güzelliğini yaşıyorum. test edilmemiş çekirdek. Buna göre, uygulama, geleneksel (okuma: kötü ve/veya tembel) fonksiyonel test için tamamlanmadan ve kesinlikle n + 1 harici API sürümünden önce tamamlanmadan önce bazı testler yapmak istiyorum. Düz bir cevaba ek olarak, çözümün bir örneği büyük ölçüde takdir edilecektir.

+1

gibi bir test çerçevesini, bir sonraki soru önlemek için - neden test düzeneği test düzeneği imzalanmış ise imzalanacak zorunda? - İşte bu konuyla ilgili makalem: http://blogs.msdn.com/ericlippert/archive/2009/06/04/alas-smith-and-jones.aspx –

cevap

28

Bunu başarmak için derleme düzeyi özniteliği InternalsVisibleToAttribute kullanabilirsiniz.

sizin Projem montaj AssemblyInfo.cs için

[assembly:InternalsVisibleTo("MyProjectTests")] 

ekleyin.

+0

Uygun güçlü isim anahtarı referansıyla birlikte, - Meclislerini isimlendiriyorsun, değil mi? –

3

Sen "MyProject (C#)" nin AssemblyInfo.cs için

[assembly:InternalsVisibleTo("Unit.Tests.Assembly")] 

eklemeniz gerekir. Bu, testlerin test için dahili yöntemlere erişmesine izin verir. Kamu arabirimi veya API'yla iç sınıfları test etmek -

+2

kırık bağlantı lütfen düzeltiyor – Darcy

1

Ben bu yaklaşıma karşı öneriyoruz Ancak InternalsVisibleToAttribute

ihtiyacınız olduğu anlaşılıyor.

+0

Sorun şu ki; ve bir süre için değil. Büyük bir proje türü (ya da tamamlandığında). –

+0

İçten dışa yaklaşımla ilgili sorun, içyapılarınızın yapıldığı bir duruma girebiliyor olmanızdır .. ama harici API beklendiği gibi takılmıyor - çünkü anlamada bir bağlantı kesildi. Geri bildirim daha sonra gelir. Düzeltmek daha pahalı olduğunda. – Gishu

+0

Doğru, ancak uygulama "tamamlandı" kadar kapsamlı testler yapmak sadece dert için yalvarıyor. Ayrıca, dış API muhtemelen işlevselliği genişletmekten ziyade kullanıcı eylemini otomatikleştirmeyi ve verileri ayıklama şeklini alacak; Tam üfleme eklenti API'sine kıyasla daha da zorlaşır. –

3

adlandırılmış bir meclise iç yöntemlere erişim sağlayan ana proje için AssemblyInfo.cs bir özellik ekleyerek, iç yöntemleri test edebilirsiniz:

[assembly: InternalsVisibleTo ("MyProjectTestsNameSpace.MyProjectTests ")] bu konuda gitmek için en az 2 başka yolları da vardır

ayrıntılı bilgi, [InternalsVisibleTo] en mantıklı yolu IMO olsa here

+0

bağlantısı bozuk :( – User193452

0

geçerli:

  • Reflection

    var method = instance.GetType().GetMethod(
        methodName, BindingFlags.NonPublic | BindingFlags.Instance, 
        null, paramTypeArray, null); 
    return method.Invoke(instance, parameters); 
    
    kullanarak

Bu yaklaşım, yöntem adı veya imzanın değişmesi durumunda, ünite testinin Çalıştırma Zamanında başarısız olmaya başlayacağı, buna karşılık [InternalsVisibleTo]'un bu kırılma zamanını derleme zamanında kolayca alacağıdır.

İlgili konular