2013-03-15 20 views
48

Chciałbym napisać bibliotekę klas, która tworzy dla mnie obiekt złożony, ale powinna być eksponowana w jak najmniejszym stopniu. Chcę, aby był on włączony do innych projektów i tam mam tylko jedno połączenie z tą biblioteką, która np. zwraca mi obiekt klasy stworzonej wewnętrznie. Nie chcę pozwalać innym na jawne tworzenie tych obiektów, ale nadal chcę utworzyć projekt testowy dla tej biblioteki klas.Jak przetestować bibliotekę wewnętrzną?

Na przykład:

var result = Manager.Instance.Create(definition) 

ta powinna być tylko dostęp do biblioteki klas.

Na podstawie parametru definicji używa różnych podklas do utworzenia żądanej instancji i odpowiedniego ustawienia jej właściwości. Dlatego chcę w jakiś sposób zapewnić, że cały proces tworzenia działa dobrze. Ale ponieważ nie chcę również ujawniać bardzo małych wewnętrznych właściwości obiektu wynikowego, nie mogę przetestować, używając tylko tej metody publicznego dostępu, ponieważ nie mam żadnych właściwości, na których można by się opierać.

Wiem, że nie powinieneś testować wewnętrznej mechaniki i jest to zazwyczaj zły projekt, a także czytałem przez this article, ale czy nie istnieje sposób na stworzenie biblioteki i projektu testowego jednostki, a może potem ograniczyć dostęp do tej klasy? z wrapperem czy czymś?

+0

Jaki język używasz? –

+0

Duplikat: http://stackoverflow.com/q/358196/492 –

Odpowiedz

123

W .NET można używać biblioteki InternalsVisibleToAttribute w bibliotece klas, aby typy wewnętrzne były widoczne dla projektu testu jednostki.

W ten sposób możesz zachować klasę wewnętrzną i nadal używać jej z innych zespołów, które dajesz dostęp.

go używać tak:

[assembly:InternalsVisibleTo("NameOfYourUnitTestProject")] 
+0

tego nie wiedział! Dziękuję Ci! –

+10

Świetne rozwiązanie! Kilka dodatkowych informacji: 1) W przypadku, gdy ta składnia "[assembly: ...]" nie dzwoni dzwonkiem: są to atrybuty Assembly (http://msdn.microsoft.com/en-us/library/4w8c1y2s. aspx), najbardziej znanym z nich jest "AssemblyVersionAttribute" i jego bracia. 2) Możesz ich użyć w dowolnym pliku .cs w swoim projekcie, poza obszarem nazw, ale zazwyczaj są one określone w pliku 'AssemblyInfo' znajdującym się w folderze projektu 'Właściwości'. 3) Musisz rzeczywiście podać * nazwę * twojego projektu, a nie * przestrzeń nazw *, na wypadek gdyby były one różne. –

+0

To niesamowite, nie miałem pojęcia, że ​​można to zrobić, każdego dnia uczysz się czegoś nowego! – MaYaN

Powiązane problemy