Jestem nowy w testowaniu jednostkowym i staram się dowiedzieć, czy powinienem zacząć używać więcej „wewnętrznego” modyfikatora dostępu. Wiem, że jeśli użyjemy „wewnętrznego” i ustawimy zmienną asemblerową „InternalsVisibleTo”, możemy przetestować funkcje, których nie chcemy ogłaszać publicznie z projektu testowego. To sprawia, że myślę, że zawsze powinienem używać „wewnętrznego”, ponieważ przynajmniej każdy projekt (powinien?) Ma swój własny projekt testowy. Czy możecie mi powiedzieć, dlaczego nie powinienem tego robić? Kiedy powinienem używać „prywatnego”?
c#
.net
unit-testing
tdd
Hertanto Lie
źródło
źródło
System.Diagnostics.Debug.Assert()
samych metod.Odpowiedzi:
Klasy wewnętrzne muszą zostać przetestowane, a istnieje atrybut assemby:
Dodaj to do pliku informacji o projekcie, np
Properties\AssemblyInfo.cs
.źródło
private
, ale zbyt wieleprivate
rzeczy może równie dobrze wskazywać nainternal
klasę, która ma trudności z wyodrębnieniem. TDD lub brak TDD, wolę mieć więcej testów, które testują dużo kodu, niż mieć kilka testów, które wykonują tę samą ilość kodu. A unikanie testowaniainternal
rzeczy nie pomaga w osiągnięciu dobrego stosunku.#if DEBUG
,#endif
blok włącza tę opcję tylko w kompilacjach debugowania.Jeśli chcesz przetestować metody prywatne, przyjrzeć się
PrivateObject
iPrivateType
wMicrosoft.VisualStudio.TestTools.UnitTesting
przestrzeni nazw. Oferują łatwe w użyciu opakowania wokół niezbędnego kodu odbicia.Dokumenty: PrivateType , PrivateObject
W przypadku wersji VS2017 i 2019 można je znaleźć, pobierając nuget MSTest.TestFramework
źródło
Dodając do odpowiedzi Erica, możesz również skonfigurować to w
csproj
pliku:Lub jeśli masz jeden projekt testowy na projekt do przetestowania, możesz zrobić coś takiego w swoim
Directory.Build.props
pliku:Zobacz: https://stackoverflow.com/a/49978185/1678053
Przykład: https://github.com/gldraphael/evlog/blob/master/Directory.Build.props#L5-L12
źródło
Domyślnie używaj prywatnego. Jeśli członek nie powinien być narażony poza ten typ, nie powinien być narażony poza ten typ, nawet w ramach tego samego projektu. Dzięki temu wszystko jest bezpieczniejsze i bardziej uporządkowane - gdy używasz obiektu, jest bardziej jasne, z jakich metod możesz korzystać.
To powiedziawszy, myślę, że czasem rozsądne jest uczynienie metod naturalnie prywatnych wewnętrznymi dla celów testowych. Wolę to od użycia refleksji, która jest nieprzyjazna dla refaktoryzacji.
Jedną rzeczą do rozważenia może być sufiks „ForTest”:
Następnie, gdy korzystasz z klasy w ramach tego samego projektu, oczywiste jest (teraz iw przyszłości), że tak naprawdę nie powinieneś używać tej metody - jest ona dostępna tylko w celach testowych. Jest to trochę zuchwałe i nie robię tego sam, ale przynajmniej warto to rozważyć.
źródło
ForTest
podejścia, ale zawsze uważam to za brzydkie (dodanie kodu, który nie zapewnia żadnej rzeczywistej wartości z punktu widzenia logiki biznesowej produkcji). Zwykle uważam, że musiałem zastosować to podejście, ponieważ projekt jest nieco niefortunny (tj. Musiałem resetować instancje singletonów między testami)ForTest
jest oczywiście niepoprawny, podczas gdy jeśli uczynisz metodę wewnętrzną, wygląda na to, że można z niej korzystać.Możesz także użyć prywatnego i możesz wywoływać prywatne metody z refleksją. Jeśli korzystasz z Visual Studio Team Suite, ma on fajną funkcjonalność, która wygeneruje serwer proxy do wywołania twoich prywatnych metod. Oto artykuł dotyczący projektu kodu, który pokazuje, jak możesz sam wykonać pracę, aby przetestować metody prywatne i chronione:
http://www.codeproject.com/KB/cs/testnonpublicmembers.aspx
Pod względem tego, jakiego modyfikatora dostępu należy użyć, moja ogólna zasada zaczyna się od prywatnego i eskaluje w razie potrzeby. W ten sposób ujawnisz tak mało wewnętrznych szczegółów swojej klasy, jakie są naprawdę potrzebne, i pomaga ukryć szczegóły implementacji, tak jak powinny.
źródło
Używam
Dotnet 3.1.101
i.csproj
dodatki, które działały dla mnie były:Mam nadzieję, że to pomoże komuś tam!
źródło