2017-02-14 22 views
26

Obecnie korzystam z najnowszego kandydata Visual Studio 2017 Release, tworząc bibliotekę .Net Standard 1.6. Używam xUnit do przetestowania mojego kodu i zastanawiałem się, czy nadal możesz testować wewnętrzne metody w VS2017.Metody wewnętrzne testowania jednostkowego w bibliotece standardowej .Net VS2017

Pamiętam, że można wszystkie klasy AssemblyInfo.cs linii w VS2015, która umożliwiłaby określonych projektów, aby zobaczyć metody wewnętrznych

[assembly:InternalsVisibleTo("MyTests")] 

Ponieważ nie ma klasy AssemblyInfo.cs w projektach VS2017 .Net Standardowych byłem zastanawiasz się, czy wciąż możesz testować metody wewnętrzne?

+3

Powinieneś * móc * przetestować swój kod tylko z zewnątrz widocznej funkcji. W końcu, jeśli żadna logiczna ścieżka z zewnętrznego kodu nie mogłaby dotrzeć do tych metod wewnętrznych, to co by tam robili w pierwszej kolejności? – David

+1

@David Mogłem i mogłem to zrobić, ale wcześniej umieściłem proste testy jednostkowe wokół niektórych klas wewnętrznych. Po prostu bardziej wyraźne w testowaniu. –

+1

AFAIK, możesz umieścić ten atrybut w dowolnym innym pliku poza blokiem 'namespace' i powinien on się skompilować. W "AssemblyInfo.cs" nie powinno być niczego magicznego. Czy to nie działa? Oczywiście, musisz dodać poprawną klauzulę 'using' lub użyć w pełni kwalifikowanego atrybutu' [assembly: System.Runtime.CompilerServices.InternalsVisibleTo ("Something")] '. – Groo

Odpowiedz

45

Według .NET docs for the InternalsVisibleToAttribute:

atrybutu jest stosowana na poziomie zespołu. Oznacza to, że może on być zawarty na początku pliku kodu źródłowego lub może być zawarty w pliku AssemblyInfo w projekcie Visual Studio.

Innymi słowy, można po prostu umieścić go w swoim własnym dowolnie wskazanego pliku .cs i powinno działać prawidłowo:

// some .cs file included in your project 
using System.Runtime.CompilerServices; 
[assembly:InternalsVisibleTo("MyTests")] 
+1

Tak, to działa. Nigdy tego nie uważałem :-) –

+1

@PhilMurray: wydaje się, że istnieje ustawienie, które powinno pozwolić ci na stworzenie "klasycznego" pliku 'AssemblyInfo.cs' jak wyjaśniono [tutaj] (http://stackoverflow.com/a/42183749/69809). W przeciwnym razie wszystkie atrybuty, takie jak "opis", "copyright" i inne rzeczy zostaną zapisane w pliku .csproj. – Groo

2

Atrybut „InternalsVisibleTo” jest kluczem do wszelkiego rodzaju „biały -box "(okres dekady, jak sądzę) testowanie dla .Net. Może być umieszczony w dowolnym pliku C# z atrybutem "assembly" z przodu. Zauważ, że MS DOCs mówią, że nazwa zestawu musi być kwalifikowana przez token klucza publicznego, jeśli jest podpisany. Czasem to nie działa i trzeba użyć pełnego klucza publicznego w swoim miejscu. Dostęp do internals jest kluczem do testowania systemów współbieżnych i wielu innych sytuacjach. Zobacz https://www.amazon.com/xUnit-Test-Patterns-Refactoring-Code/dp/0131495054. W tej książce Meszaros opisuje różnorodne style kodowania, które zasadniczo stanowią podejście do projektowania programu "Zaprojektuj na próbę". Przynajmniej w ten sposób używam go przez te wszystkie lata.