Nie ma na to dwóch sposobów. Sugestie ReSharpera i kilka przydatnych funkcji języka C # nie byłyby używane tak często, gdybyś pisał izolowane testy jednostek atomowych dla całego kodu.
Na przykład, jeśli masz metodę statyczną i musisz ją zlikwidować, nie możesz tego zrobić, chyba że użyjesz struktury izolacji opartej na profilu. Obejściem kompatybilnym z połączeniem jest zmiana początku metody używania notacji lambda. Na przykład:
PRZED:
public static DBConnection ConnectToDB( string dbName, string connectionInfo ) {
}
PO:
public static Func<string, string, DBConnection> ConnectToDB (dbName, connectionInfo ) {
};
Oba są kompatybilne z połączeniami. Dzwoniący nie muszą się zmieniać. Ciało funkcji pozostaje takie samo.
Następnie w kodzie testu jednostkowego możesz w ten sposób wyciąć to wywołanie (zakładając, że należy ono do klasy o nazwie Baza danych):
Database.ConnectToDB = (dbName, connectionInfo) => { return null|whatever; }
Po zakończeniu należy go zastąpić oryginalną wartością. Możesz to zrobić za pomocą try / wreszcie lub, w trakcie czyszczenia testu jednostkowego, tego, który jest wywoływany po każdym teście, napisz kod taki jak ten:
[TestCleanup]
public void Cleanup()
{
typeof(Database).TypeInitializer.Invoke(null, null);
}
który ponownie wywoła statyczny inicjalizator twojej klasy.
Lambda Funcs nie są tak bogate w wsparcie jak zwykłe metody statyczne, więc takie podejście ma następujące niepożądane skutki uboczne:
- Jeśli metoda statyczna była metodą rozszerzenia, najpierw musisz ją zmienić na metodę inną niż rozszerzenie. Resharper może to zrobić automatycznie.
- Jeśli którykolwiek z typów danych metod statycznych jest zespołem osadzonym międzyoperacyjnie, na przykład dla pakietu Office, musisz owinąć metodę, owinąć typ lub zmienić go na typ „obiekt”.
- Nie możesz już korzystać z narzędzia refaktoryzacji podpisów zmian Resharpera.
Powiedzmy jednak, że całkowicie unikasz statyki i zamieniasz ją na metodę instancji. Nadal nie można go wyśmiewać, chyba że metoda jest wirtualna lub zaimplementowana jako część interfejsu.
Tak więc w rzeczywistości każdy, kto sugeruje rozwiązanie problemu umieszczania metod statycznych, ma uczynić je metodami instancji, byłyby także przeciwne metodom instancji, które nie są wirtualne lub stanowią część interfejsu.
Dlaczego więc C # ma metody statyczne? Dlaczego dopuszcza metody instancji innych niż wirtualne?
Jeśli użyjesz jednej z tych „funkcji”, po prostu nie będziesz mógł stworzyć izolowanych metod.
Kiedy ich używasz?
Używaj ich do każdego kodu, którego nie spodziewasz się, że ktokolwiek zechce go usunąć. Kilka przykładów: metoda Format () klasy String, metoda WriteLine () klasy Console, metoda Cosh () klasy Math
I jeszcze jedno. Większość ludzi nie będzie się tym przejmować, ale jeśli możesz o wykonanie połączenia pośredniego, to kolejny powód, aby unikać metod instancji. Zdarzają się przypadki, gdy jest to hit wydajności. Właśnie dlatego istnieją metody inne niż wirtualne.