Jak przetestować kod Combine w Swift
Testowanie naszego kodu jest fundamentalną częścią procesu programowania.
Ale jeśli używamy struktury Combine, na pierwszy rzut oka może to być nieintuicyjne. Nie oznacza to, że nie da się tego zrobić. Musimy tylko zagłębić się w bardziej zaawansowane koncepcje, które zapewnia nam Swift.
Przyjrzyjmy się, jak łatwo możemy włączyć testy jednostkowe do naszego kodu Combine.
Zacznijmy od przyjrzenia się poniższemu menedżerowi, który symuluje obsługę sygnalizacji świetlnej.
Z naszego pierwszego artykułu Combine wiemy, że dodając opakowanie @Published, otrzymujemy darmowego Publishera, do którego możemy uzyskać dostęp za pomocą znaku $.
Testowanie
Zanim przejdziemy do tego, jak faktycznie przetestować kod Combine, przejrzyjmy kilka podstawowych koncepcji dotyczących testów jednostkowych. Możemy to podsumować w trzech krokach.
- Krok 1: Zdefiniuj, co chcesz przetestować.
- Krok 2: Wykonaj operację, którą chcesz przetestować, z wartością zdefiniowaną w kroku 1.
- Krok 3: Oceń wynik uzyskany w kroku 2.
Jest to bardzo prosty przykład, dzięki czemu można zrozumieć koncepcję. Najpierw zdefiniowaliśmy naszą oczekiwaną wartość dla testu, czyli czerwone światło. Następnie wywołujemy operację, która zmienia bieżącą wartość światła na kolor czerwony. I na koniec upewniamy się, że aktualna wartość światła jest taka sama, jak oczekiwana.
To dobrze, ale co powinniśmy zrobić, jeśli chcemy przetestować simulateFlow
funkcję? Możesz zauważyć, że wewnątrz tej funkcji trzykrotnie zmieniamy właściwość light. Tak więc pod koniec wykonywania funkcji wartość właściwości powinna zmienić się z zielonej na żółtą, z żółtej na czerwoną iw końcu z czerwonej na zieloną.
Jak możesz sobie wyobrazić, aby przetestować funkcję, musimy upewnić się, że wartość właściwości ma właściwą wartość na końcu, ale co najważniejsze, musimy mieć pewność, że wszystkie zmiany wartości (z jednej na drugą) są poprawne .
Oczekiwania
XCTestExpectations to typ obiektu, który Apple udostępnia nam do testowania kodu asynchronicznego. Zasadniczo tworzysz oczekiwanie na początku testu, a po spełnieniu określonych warunków spełniasz to oczekiwanie. Wykonanie testu będzie czekać, aż spełni się oczekiwanie lub upłynie limit czasu.
Tak więc, aby przetestować naszą funkcję, będziemy musieli poczekać, aż zbierzemy wszystkie oczekiwane wartości, o których wiemy, że currentLight
właściwość powinna się zmienić. Wtedy spełnimy oczekiwanie, jeśli otrzymamy wszystkie wartości. W przeciwnym razie test zakończy się niepowodzeniem z powodu przekroczenia limitu czasu.
Mając to na uwadze, mamy teraz odpowiednie narzędzie do stworzenia nowego testu dla naszej simulateFlow
funkcji
Podzielmy kod:
Krok 1
- Tworzymy nowe oczekiwanie do wykorzystania w naszym teście.
- Zdefiniowaliśmy oczekiwane wartości, o których wiemy, że właściwość powinna się zmienić w pewnym momencie.
- Stworzyliśmy również nową pustą listę, której będziemy używać do przechowywania wartości, które otrzymamy od Wydawcy.
- Zaczynamy wsłuchiwać się w wartości Wydawcy.
- Wywołujemy funkcję, więc zaczynamy otrzymywać zmiany wartości właściwości.
- Czekamy na spełnienie oczekiwania lub przekroczenie limitu czasu.
- Oceniamy, czy otrzymane wartości, które otrzymaliśmy, są prawidłowe.
Testowanie kodu Combine jest dość łatwe, gdy zrozumiesz potencjał oczekiwań. Chociaż widzieliśmy bardzo krótki i prosty przykład, możesz użyć tej samej techniki do testowania bardziej złożonych rozwiązań.
Na przykład możesz zastosować te zasady do testowania stanów ViewModel w architekturze MVVM lub do testowania fałszywych wywołań sieciowych.
Możesz sprawdzić moje poprzednie artykuły dotyczące Combine.
Wprowadzenie do frameworka Combine w Swifthttps://blorenzop.medium.com/form-validation-with-combine-4988adcc3b0
Jakieś pytania? Śmiało napisz do mnie wiadomość . Jeśli podobają Ci się moje treści, możesz zasubskrybować moją stronę Medium, aby otrzymywać powiadomienia bezpośrednio na swoją skrzynkę odbiorczą, gdy tylko opublikuję nowy artykuł.
Jeśli chcesz mnie wesprzeć, możesz śledzić mnie na GitHub lub Twitterze .