Modyfikator dostępu C # "internal" podczas wykonywania testów jednostkowych

Jestem nowy w testach jednostkowych i staram się dowiedzieć, czy powinienem zacząć używać więcej modyfikatorów dostępu 'wewnętrznego'. Wiem, że jeśli użyjemy 'internal' i ustawimy zmienną assembly 'InternalsVisibleTo', możemy testować funkcje, których nie chcemy deklarować publicznie z projektu testing. To sprawia, że myślę, że powinienem zawsze używać "wewnętrznego", ponieważ przynajmniej każdy projekt(powinien?) ma własny projekt testowy. Możecie mi podać powód, dla którego nie powinnam tego robić? Kiedy powinienem używać "prywatnie"?

Author: EricSchaefer, 2008-12-11

4 answers

Klasy wewnętrzne muszą być przetestowane i istnieje atrybut assemby:

using System.Runtime.CompilerServices;

[assembly:InternalsVisibleTo("MyTests")]

Dodaj to do pliku informacji o projekcie, np. Properties\AssemblyInfo.cs.

 957
Author: EricSchaefer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-17 23:51:28

Jeśli chcesz przetestować metody prywatne, spójrz na PrivateObject i PrivateType w przestrzeni nazw Microsoft.VisualStudio.TestTools.UnitTesting. Oferują one łatwe w użyciu owijki wokół niezbędnego kodu odbicia.

Docs: PrivateType, PrivateObject

 98
Author: Brian Rasmussen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-09 12:39:09

Możesz również używać metod prywatnych i możesz wywoływać metody prywatne z reflection. Jeśli używasz pakietu Visual Studio Team Suite, ma on kilka ciekawych funkcji, które wygenerują serwer proxy, aby wywołać prywatne metody dla Ciebie. Oto artykuł projektu kodu, który pokazuje, jak możesz wykonać pracę samodzielnie, aby przetestować prywatne i chronione metody:

Http://www.codeproject.com/KB/cs/testnonpublicmembers.aspx

W zakresie jakiego modyfikatora dostępu powinieneś użyć, mój ogólna zasada jest zacząć od prywatnych i eskalować w razie potrzeby. W ten sposób ujawnisz tak mało wewnętrznych szczegółów swojej klasy, jak są naprawdę potrzebne, a to pomaga utrzymać szczegóły implementacji w ukryciu, tak jak powinny być.

 8
Author: Steven Behnke,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-11 01:53:23

Domyślnie używaj opcji private. Jeśli członek nie powinien być wystawiony poza ten typ, nie powinien być wystawiony poza ten typ, nawet w ramach tego samego projektu. Dzięki temu rzeczy są bezpieczniejsze i bardziej uporządkowane - kiedy używasz obiektu, jaśniej jest, z jakich metod masz być w stanie korzystać.

Mimo tego, myślę, że rozsądne jest, aby metody naturalnie prywatne były czasami wewnętrzne dla celów testowych. Wolę to od używania refleksji, czyli refaktoryzacji-nieprzyjaznej.

One rzecz do rozważenia może być przyrostkiem "ForTest":

internal void DoThisForTest(string name)
{
    DoThis(name);
}

private void DoThis(string name)
{
    // Real implementation
}

Wtedy, gdy używasz klasy w ramach tego samego projektu, jest oczywiste (teraz i w przyszłości), że tak naprawdę nie powinieneś używać tej metody - jest tam tylko do celów testowych. To jest trochę chwiejne, i nie coś, co robię sam, ale to przynajmniej warte rozważenia.

 8
Author: Jon Skeet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-11 06:27:57