w Praktyce
7 godz. 1 min · Angular · Full-stack i Programowanie
Mateusz KuleszaSenior Software Developer, Konsultant, TrenerPodstawą produktywnej pracy z angularem jest możliwość zagwarantowania że wszystko działa bez potrzeby wielokrotnego “przeklikiwania” poszczególnych ekranów. W pierwszej części kursu omawiam więc temat testów automatycznych.Już po obejrzeniu pierwszych lekcji zobaczysz dlaczego warto testować kod i jak dzięki narzędziom dostarczonym z angularem jest to proste. Zobaczysz jak testowanie automatyczne pozwoli zaoszczędzić Ci wiele godzin spędzonych na szukaniu błędów.
Za jakość aplikacji odpowiada nie tylko to czy działa ona poprawnie, ale w dużej mierze decyduje o tym dobry interfejs użytkownika oraz UX, czyli user experience. Dwie kolejne sekcje kursu poświęcone są właśnie dobremu UI oraz UX. Omawiam typowe problemy w oparciu o zasady i wskazówki specyfikacji Google Material Design - jednej z najbardziej szczegółowych specyfikacji UX. Wszystkie przykłady UI zarówno w wariantach desktopowych jak i mobilnych omówione są na przykładzie Angulara oraz obszernej biblioteki komponentów Angular Material. Zobaczysz nie tylko jak korzystając z gotowych komponentów błyskawicznie budować nowe funkcjonalności, ale przy okazji omówimy wiele praktycznych wskazówek oraz dobrych praktyk UX które warto wykorzystać w Twoich aplikacjach.
W ramach budowania interfejsów skupimy się na najmniejszych szczegółach takich jak prawidłowe zachowanie linków, przycisków oraz wskaźników przechodząc stopniowo do coraz większych elementów aplikacji takich jak nawigacja, układ strony, paski nawigacyjne czy okna dialogowe. Przy każdym etapie czeka Cię masa wskazówek, przykładów i rozwiązań typowych problemów user experience.
Jednak UX to nie tylko wygląd i zachowanie pojedynczych elementów. W ostatnich sekcjach kursu dowiesz się jak projektować bardziej złożone interakcje z użytkownikiem. Zobaczysz wieloetapowe formularze kreatora oraz dowiesz się jak zarządzać stanem aplikacji oraz różnymi źródłami danych. Pokaże Ci jak zbudować samodzielnie sortowane, filtrowane i stronicowane źródła danych oraz połączyć je z różnymi komponentami UI takimi jak listy czy datagrid.
Na koniec kursu zobaczysz jak możemy różne gotowe elementy UI połączyć w przepływ ekranów budując ścieżkę użytkownika. Zobaczysz jak prawidłowo zaprojektowane komponenty wraz z dobrze zaplanowanym UX pozwalają być niesamowicie produktywnym jednocześnie nie poświęcając jakości czy dobrej architektury aplikacji.
Jest to kurs dla osób które już pracowały z angularem i chciałyby wyjść poza pojedyncze techniki oraz poznać proces projektowania aplikacji w praktyce z uwzględnieniem najlepszych praktyk programistycznych oraz user experience. Zarówno w wariancie webowym jak i projektując pod urządzenia mobilne.
Angular 6, 7, 8+
We wcześniejszych lekcjach tutaj testowaliśmy komponent który
jest statyczny tutaj nic nie zmieniało cały czas był ten sam tekst renderowany i
to jest troszkę za mało na aplikacjach aplikacje angulara one
służą angular służy do tego żeby renderować dynamicznie zmieniające się tutaj szablony i
właśnie tyle mają się w tej lekcji tutaj ten tekst który jest statyczny
zamienimy na tekst dynamiczny i zobaczymy obsłużymy test który sprawdzi czy tam
się prawidłowo wyświetla tu troszkę uproszczę sytuację zrobię
tylko sobie jeden element nasz message będziemy tylko ten jeden message
znajdować i tu sprawdzamy czy on równy jest message works spróbujmy
zmienić to tak żeby nie popsuć tego testu czyli przyniosę message
works cały ten tekst który tu się znajdował spróbuję przenieść tutaj
do komponentu czyli nasz task list component i
przypiszę go do zmiennej message w ten sposób i
tutaj umieszczę odniesienie
do tej zmiennej message czyli jak widzisz tekst powinien znakjdować się w tym samym miejscu
dokładnie ten sam tekst jednak jak widzisz to jest błąd bo
tutaj on oczekuje message works czyli
matchujemy message works a tekst wyrenderowany w tym elemencie tutaj
p to jest pusty tekst pytanie dlaczego nasz
tutaj message mimo że znajduje się na komponencie plik jest tutaj zapisany tutaj
to jest dokładnie jak kliknę widzisz przeskakuje mi to jest dokładnie ten element więc
wszystko się zgadza on mi tu nie wyświetla tego tekstu w angularze bardzo ważną
koncepcją jest wykrywanie zmian czyli jeśli umieszczam komponent on
po prostu jest renderowany jako sam html dopiero
po wykryciu zmian angular podstawia pod wszystkim
interpolację najnowsze wersję tych zmiennych tak po dokonanych zmianach
on sprawdza co się zmieniło i aktualizuje te wszystkie tutaj wiązania więc w
ten sposób my wyrenderowaliśmy komponent ale on właśnie nie miał wykrywania
zmian nie miał tutaj fazy w której dopiero on tu uzupełnia poprawne
dane i teraz możemy bardzo prosto to naprawić tutaj jak pamiętasz fixture
miał taką metodę jak auto detect changes i auto detect changes
raz by to uruchomił a potem by czekał na jakieś zdarzenia
typu promise'y albo kliknięcia myszy i tak dalej dokładniejszą
precyzyjną tutaj opcją bardziej byłoby detect changes manualne czyli ja
wtedy wiem nie czekam aż może coś się wydarzy jakieś zdarzenie tylko ja dokładnie wiem
że coś zostało zmienione i chce
aby angular sprawdził jak to wpłynęło na szablon i przerenderował
tutaj zaktualizował tutaj odpowiednie miejsca w szablonie i zobacz na samym początku testu tutaj dodaję
detect changes żeby angular w ogóle zaktualizował html i
dopiero wtedy szukam tutaj treści tak naprawdę mogę najpierw znaleźć element
a później sprawdzić co w nim jest albo mogę najpierw robić wykrywanie zmian tutaj
nie ma znaczenia bo zmiany pojawiają się wewnątrz elementu message zobaczymy teraz control s zapisałem
jak widzisz teraz nie ma błędu tutaj jak zrobię jeszcze spację
nasz test teraz widzisz tutaj mówisz że w tym elemencie html
wyrenderował się napis message works i to się dokładnie zgadza z tym co mamy tutaj
u nas w naszym teście czyli jak widzisz musimy
użyć detect changes nawet przed pierwszym renderowaniem
żeby pojawiły nam się tutaj jakiekolwiek zmiany czyli możemy
żeby sobie usprawnić ułatwić życie żeby przy każdym
teście musieć jeszcze musisz pamiętać o tym pierwszym wykryciu możemy oczywiście to pierwsze wykrycie zmian przenieść
do before each i w ten sposób przed każdym testem mamy gwarancję
html już zawiera jakieś początkowe dane że to
wykrywanie zmian nastąpiło pierwsze renderowania początkowe to
jedna rzecz ale co jeśli dane się zmienią więc napiszmy tutaj jeszcze jeden test powiedzmy
że it should render updated task name czyli
co się stanie jeśli my zmienimy te dane jak to się zachowa
ja tu jeszcze jedną zmianę wprowadzę tu ma być task name mamy message więc
ja tutaj wprowadzę sobie nazwę task name nazwę klasy i tu
też zmienię na task name i tutaj zmienimy podobnie znajdę
element sprawdzę czy treść
tego elementu tutaj równa się nie message
works tylko updated name tak czyli sprawdzimy czy po
zmianie czyli nasz komponent nasz
komponent komponent który tu sobie utworzyliśmy komponent teraz powinien zawierać
tutaj zmienną message bo jak pamiętasz tutaj do naszego komponentu
dodaliśmy tutaj elegancko jak widzisz pole message one początkowo ma wartość
message works my chcemy je zmienić na updated
name i chcemy zobaczyć czy tutaj to
nowa treść ona się tutaj nam wyrenderuje w tym naszym
komponencie i jest problem bo ten komponent
jak widzisz cały czas zawiera tą początkową wiadomość nie zawiera
tej nowej zmienionej i za każdym razem jeśli wprowadzasz zmiany gdzieś
w danych twoich i chcesz by te dane się wyświetliły musisz
pamiętać za każdym razem żeby powiedzieć angularowi uwaga zostały wprowadzone zmiany przerenderuj
komponenty i sprawdź czy wszystko działa czyli jak dodam
tutaj fixture detect changes tutaj jak widzisz
mamy pełen sukces czyli musisz pamiętać że za każdym razem jak wprowadzasz zmiany
gdzieś w danych i chcesz żeby te zmiany zostały prawidłowo tutaj zaktualizowane
w htmlu że twoje komponenty wyrenderowały te zmiany nim sprawdzisz
czy te elementy tutaj istnieją czy ten tekst się zgadza pamiętaj żeby po
zmianach wykonać detect changes chyba że te zmiany są wynikiem
na przykład działania promisów czy tutaj strumienie rx js czy jakichś
akcji użytkownika w wyniku kliknięcia myszą czy
czy klawisz na klawiaturze to możesz pokusić się o fixture autodetect
changes tylko tutaj detect changes jest zawsze jakby bardziej precyzyjne bo wiesz
dokładnie w którym momencie oczekujesz tutaj wykrywania zmian
pamiętaj o tym że w testach musimy tutaj sami zarządzać wykrywaniem zmian w
prawdziwej aplikacji angulara sam wykrywa te zmiany gdy nastąpi
jakakolwiek interakcja z otoczeniem na przykład jeśli użytkownik tutaj kliknie
gdzieś myszą jeśli na klawiaturę na przykład użyję klawiatury czy
na przykład tyknie zegar bo zegar to też jest zdarzenie które przychodzi
na zewnątrz tak samo nawet jeśli przyjdzie odpowiedz z serwera to też wszystko są zdarzenia
które są wykrywane przez angulara i ona automatycznie spowodują wykrywanie zmian
w testach niestety jeśli nie ma takich efektów jeśli nie ma jakiegoś
zdarzenia tylko my ręcznie zmieniamy dane pamiętaj o tym żeby zawsze tutaj wykonać
wykrywanie zmian żeby te zmiany zostały wprowadzone do html
żeby były tutaj wyrenderowane zostały w naszym komponencie i
w ten sposób możemy wykryć zmiany zaktualizować tutaj szablon
jednak jest to komunikacja tylko w jedną stronę w ten sposób to co my ustawimy w
komponencie możemy jedynie wyświetlić użytkownikowi brakuje
nam komunikacji w drugą stronę czyli jak przetestować sytuacje kiedy użytkownik
wchodzi w interakcje z naszą aplikacją jak zasymulować takie działanie i
zobaczyć czy nasza aplikacja zachowała się prawidłowo czy
prawidłowo zareagowała na jakąś akcję użytkownika o tym
wszystkim już w kolejnej lekcji tak więc do zobaczenia