Szyderczy test jednostkowy iOS przy użyciu Swifty mocky
Swift został zaprojektowany tak, aby był bezpieczny — wspierał refleksję tylko do odczytu. Dlatego nie ma możliwości modyfikacji programu w czasie wykonywania. Ogólnie jest dobrze, kod jest wykonywany zgodnie z oczekiwaniami, a inne komponenty nie mogą tego zmienić. Ale wracając do naszego tematu, wszystkie szydercze frameworki są zbudowane na refleksji, aby móc zmieniać klasy, typy i obiekty w czasie wykonywania.
Ten język potrzebuje swoich superbohaterów do pisania testowalnego kodu, a my dobrze ich znamy — protokołów i rozszerzeń! Bez względu na to, jaka to implementacja — klasa, enum czy struktura — cel protokołów pozostaje niezmieniony — definiowanie abstrakcji i dodawanie nowych funkcji do typów, nawet tych, których nie jesteśmy winni.
Co możemy zrobić, żeby kpić?
Użyj metaprogramowania, aby wygenerować pełną próbną implementację.
Jest wiele bibliotek wykonujących pozorowane zadania do testów jednostkowych, większość topoli to Cuckoo i swifyMocky .
W tym artykule przedstawię przegląd tego, jak możemy kpić za pomocą SwiftyMocky.
SwiftyMocky
https://github.com/MakeAWishFoundation/SwiftyMocky
Zalety
- Automatycznie próbuj protokołów Swift
- Wspieraj leki generyczne
- Prosta konfiguracja i lekkość
- Dobra dokumentacja
- Ładna i łatwa składnia (wykorzystująca autouzupełnianie)
- Oznacz protokoły do wyszydzenia
- Każdy protokół w katalogach źródłowych posiadający taką adnotację zostanie dodany do Mock.generated.swift
- Wszystkie makiety mają podaną metodę (dostępną zarówno jako metoda instancji, jak i funkcję globalną), z łatwą w użyciu składnią, pozwalającą określić, jakie wartości powinny być zwracane dla danych metod (na podstawie określonych atrybutów)
- Wszystkie makiety posiadają metodę weryfikacji (dostępną zarówno jako metoda instancyjna, jak i funkcja globalna), z łatwą w użyciu składnią, pozwalającą zweryfikować, czy metoda została wywołana na makiecie i ile razy. Zapewnia również wygodny sposób określenia, czy atrybuty metody mają znaczenie (i które)
- Wszystkie makiety posiadają metodę perform (dostępną zarówno jako metoda instancyjna, jak i funkcja globalna), z łatwą w użyciu składnią, pozwalającą na określenie domknięcia, które zostanie wykonane po wywołaniu metody stubed
Ustawiać
- Zainstaluj za pomocą Cocoapods
- Zainstaluj CLI w celu łatwego generowania makiet
> Swiftymocky doctor # zatwierdź konfigurację
> Swiftymocky generuj # generuj makiety
- Generowanie makiet oparte jest na pliku Mockfile.yml z możliwością wykluczenia reguł Swift Lint za pomocą wykluczonychSwiftLintRules
Nie tak wiele narzędzi, które my, programiści, mamy do kpin na Swift, z pewnymi ścisłymi granicami ze względu na ograniczony dostęp do języka w czasie wykonywania. I tu dochodzimy do krytycznego pytania — używać zewnętrznych frameworków do kpin czy nie.
Znany wujek Bob nie używa ich tak często, jak to możliwe; mówi: „Punkt, w którym zaczynasz potrzebować szyderczego frameworka, jest dokładnie tym punktem, w którym sprzężenie między twoimi testami a kodem staje się zbyt wysokie. Po tym jednak powinieneś dążyć do utrzymania sprzężenia między kodem a testami na tyle niskim, aby nie trzeba było zbyt często używać mockingu.”
Dziękuję za przeczytanie! Jeśli spodobał Ci się ten artykuł, klaszcz, aby inni też mogli go przeczytać :)
Miłego kodowania :v: