Testing metoda statyczna nie jest inaczej niż jakąkolwiek inną metodę testowania uwzględniając metodę statyczną jako uzależnienia wewnątrz innego testowanego modułu stwarza problemy (.. jak już wspomniano - nie możesz oszukiwać/ogłaszać go za pomocą bezpłatnych narzędzi), ale jeśli sama statyczna metoda jest testowana jednostkowo, możesz po prostu treat it as working, reliable component.
Ogólnie rzecz biorąc, nie ma nic złego (jak w, nie zakłóca to testowanie jednostkowe/TDD) metodami statycznymi, gdy:
- to jest proste, metoda wejścia-wyjścia (wszystkie rodzaje „oblicz tego względu, że”)
- jest niezawodny, przez co mamy na myśli to albo przetestowany przez Ciebie jednostka lub pochodzi z 3rd źródła partii rozważyć niezawodny (na przykład.
Math.Floor
można uznać za niezawodny - używanie go nie powinno podnosić "Uważaj, jest statyczne!" ostrzeżenie; można założyć, że Microsoft wykonuje swoją pracę)
Kiedy metody statyczne spowodują problemy i należy ich unikać?W zasadzie tylko wtedy, gdy ich interakcji z/zrobić coś, czego nie może kontrolować (lub makiety):
- wszelkiego rodzaju systemu plików, bazy danych zależnościami sieciowymi
- innych (prawdopodobnie bardziej skomplikowanych) metod statycznych wywoływane z wewnątrz
- prawie wszystko twój szyderczy ramy nie może zajmować się na zwykłych warunkach
Edit:dwa przykłady, gdy metoda statyczna będzie make testowanie jednostkowe ciężko
public int ExtractSumFromReport(string reportPath)
{
var reportFile = File.ReadAllText(reportPath);
// ...
}
Jak radzić sobie z File.ReadAllText
? To oczywiście przejdzie do systemu plików, aby pobrać zawartość pliku, co nie jest ważne podczas testów jednostkowych. Jest to przykład metody statycznej z zewnętrzną zależnością. Aby tego uniknąć, zwykle tworzysz wrapper wokół api systemu plików lub po prostu wstrzykujesz go jako zależność/delegata.
public void SaveUser(User user)
{
var session = SessionFactory.CreateSession();
// ...
}
Co na ten temat? Sesja to nietrywialna zależność. Pewnie, może przyjść jako ISession
, ale jak wymusić SessionFactory
, aby powrócić z fałszywą próbą? Nie możemy. I nie możemy stworzyć obiektu łatwego do detekcji .
W takich przypadkach najlepiej unikać stosowania metod statycznych.
, co się dzieje, gdy metoda statyczna wykonuje obliczenia i nie można z nich kpić? Czy wymaga to metody instancji? – Pingpong
@Pingpong: Czy mógłbyś nieco rozwinąć? 'Math.Floor' wykonuje obliczenia - czy szydzimy z nich? Nie, ponieważ wiemy, że 'Math.Floor (2.5)' zwróci 2. Kiedy dane wejściowe są ** łatwe do ustalenia ** nie musisz niczego drwić (lub używać instancji). Cała * statyczna metoda sprawia, że testowanie jest trudne * wynika z sytuacji, w których dostarczają one nietrywialnych zależności lub mają efekty uboczne. Zobacz moją edycję. –
Co ze statyczną metodą to niestandardowa metoda, która wykonuje długie obliczenia procesu? – Pingpong