Atrybut InternalsVisibleTo dla blibliotek strong-named

Atrybut InternalsVisibleTo służy do definiowania zaprzyjaźnionych bibliotek. “Zaprzyjaźniona” biblioteka to taka, która ma dostęp do klas i metod z modyfikatorem “internal”. Zwykle korzysta się z niego w celu przetestowania wewnętrznych klas. Czasami bywa, że klasy w bibliotece mają modyfikator internal i co za tym idzie, nie ma do nich bezpośrednio dostępu z testów. Za pomocą InternalsVisibleTo można zrobić wyjątek dla jakieś biblioteki, w tym przypadku projektu z testami.

Wystarczy w pliku Assembly.cs biblioteki zawierającej klasy internal umieścić:

[assembly:InternalsVisibleTo("AnyName.Tests")

Od tego momentu, AnyName.Tests będzie mogło korzystać z wewnętrznych klas projektu,  w którym znajduje się powyższy atrybut.
Oczywiście należy pamiętać, żeby testy jednostkowe skupiały się na testowaniu zachowania, a nie internali. W wielu przypadkach, powyższy atrybut jest sygnałem, że testujemy nie to co trzeba. Czasami jednak, testowanie przez publiczne API może być zbyt skomplikowane i niedokładne. Osobiście używam czasami tego atrybutu, jeśli logika w klasach wewnętrznych jest zbyt bardzo skomplikowana, aby testować ją wyłącznie przez publiczne API.

Jeśli biblioteka jest  typu strong-named (podpis cyfrowy), wtedy musimy podać pełny klucz publiczny obok nazwy. Obydwie biblioteki (logika oraz testy) muszą być zatem podpisane. Wtedy obok nazwy, podajemy również klucz publiczny, na przykład:

[assembly:InternalsVisibleTo("TestCoverage.Tests,PublicKey=002400000480000094000000060200000024000052534131000400000100010085d32843e5e1f42acd023289
dacebe34befbf561bdbb163367bb727f9292824db5aac63c7e72e45e273809937050d21230653def915ecc91e87d1eb4313cc4ed7357fd61d7698790901d1134ba34a9ce0f82f3dfb0e9bad
9c3120a3a6324a333718636b232f4a0b41c72428f2d8704d2da83edc496fe2325816bc8dfdad8feae")]

Jak widzimy na powyższym przykładzie, wklejamy pełny klucz publiczny, a nie jego token. Wystarczy, że odpalimy Developer Command Prompt oraz użyjemy poniższej komendy:

sn -Tp TestCoverage.Tests.dll

PublicKey

Powyższa komenda wyświetli zarówno pełny klucz, jak i jego token.

Leave a Reply

Your email address will not be published.