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+
W poprzedniej lekcji udało nam się skonfigurować uprząż testową w
której skompilowaliśmy komponenty i utworzyliśmy komponent wraz
z widokiem czyli udało się praktycznie wyrenderować tutaj html z
przypiętą do niego instancją komponentu w tej lekcji zajmiemy
się właśnie fixture czyli tym czymś co zwróciła funkcja
create component to że funkcja create component nie zwraca instancji tylko
zwraca tutaj cały obiekt fixture czyli instancja oraz wszystkie powiązane z instancją
rzeczy takie jak właśnie szablon czy no właśnie zobaczmy co tu się jeszcze znajduje
fixture mamy coś takiego jak autodetect changes
tutaj uwaga bo kuszące może być włączenie tutaj autodetect
o wykrywaniu zmian jeszcze powiemy autodetect wykryje
zmiany tylko w przypadku kiedy my faktycznie symulujemy
jakieś zdarzenie nie wykryje zmiany po prostu zmiennych czy obiektów wykryje
zmiany tak samo jak angular by je wykrywał czy jeśli na przykład ktoś kliknie myszką lub zasymulujemy
jakieś zdjęcie myszką czy klawiatury użyje czy na przykład zasymulujemy
odpowiedź z serwera na przykład promise który się wykonał to autodetect wykrywa
tylko faktycznie jakieś zdarzenia które nastąpiły nie wykryje
zmian takich na sucho mamy też całe detector ref czyli możemy
mieć całym mechanizmem wykrywanie zmian tutaj sterować sobie bezpośrednio z testów o
tym też później możemy sprawdzić czy nie ma zmian component intance
jak widzisz tutaj zwraca nam instancje naszego komponentu ale została tylko sama klasa tak
czyli sam javascript sam type script nie ma tutaj dostępu do widoku component
ref tutaj mamy już
komponent zamontowany na stronie czyli mamy tutaj host view czyli obiekt w którym
jest komponent zamontowany mamy location czyli element html jak na którym
jest wyrenderowany komponent mamy jakąś instancje mamy injector dependency
injection które możemy tutaj zobaczyć jakie są wstrzyknięte elementów
wstrzyknąć jakieś elementy które istnieją już gdzieś w
module lub tutaj na poziomie komponentu host
view czyli jak widzisz możemy z fixture zobaczyć elementy component
sum ale też jakby jego otoczenie miejsce w którym się znajduje i
mamy też debug element w przeciwieństwie tutaj do takiego czegoś jak native element gdzie
mamy zwykły html mamy tak debug element i jak nazwa wskazuje
debug element nie tylko element ale sporo różnych przydatnych
funkcji narzędzi właśnie do operowania na elementu html
o tym za chwilkę tu może sobie to przypisze mamy
jeszcze destroy możemy zobaczyć zniszczyć komponent całkowicie zobaczyć jak on się zachowa możemy
ręcznie uruchomić wykrywanie zmian możemy dorzucać do elementu tutaj w ten
sposób lub w ten sposób do natywnego elementu czyli elementu html który został wyrenderowany
możemy zobaczyć czy akurat nie ma żadnych zmian czy nie jest jesteśmy w
fazie wykrywania zmian tutaj ng zone możemy
zobaczyć sobie tą całą ten obszar całą strefę wykrywania
zmian w których znajduje się komponent zobaczyć w jakim znajduje się stanie czy ma jakieś zadania
czy błędy wystąpiły możemy też uruchomić jakieś zadania
tak jak widzieliśmy mamy masę rzeczy które pozwalają jakby testować ten
komponent i tu jeszcze dwie fajne rzeczy when rendering done i when stable czyli
mamy jakieś animacje można było poczekać na ich zakończenie jeśli mamy jakieś zmiany jeszcze
jakieś operacje które się nie do końca wykonały nie nie nie zostały sprawdzone
możemy także poczekać aż angular zakończy to sprawdzanie i wtedy
zobaczy czy wszystko się prawidłowo wyrenderowało okej bardzo dużo tych wszystkich nowych
informacji zajmuje się na początku tym debug elementem tutaj
ja mogę podciągnąć cały html i mogę sprawdzić
co tu się znajduje na nim i jest to jakiś sposób jednak jest
on mało taki precyzyjny tak bo komponent może mieć dużo html'a a ja bym chciał
testować czy on zawiera pojedyncze elementy a nie chce porównywać
całego html całego komponentu tego może być zbyt dużo
więc zobaczmy co znajduje się tutaj w naszym obiekcie
debug element debug
element tutaj stanowi coś na podobieństwo bardzo prostego
j query możemy powiedzieć i takiej otoczki takie opakowania
na jakiś element html który zawiera różne parametry metody które
pozwalają nam lepiej pracować łatwiej pracować z tym elementem lepiej go na przykład zbadać
czy także wprowadzać różne zmiany zobaczymy mamy taką opcję add child czy
możemy dodać element tutaj do naszego elementu możemy zobaczyć atrybuty
która nie występują możemy pobrać nodes i które children
czyli podać węzły htmlu pobrać sobie jakie się znajdują w środku
pobrać elementy które się znajdują klasę obejrzeć możemy wyciągnąć sobie
instancję komponentu jeśli takowy istnieje na tym debug elemencie możemy też zobaczyć
kontekst kontekst oznacza zmienne angularowe które
są zdefiniowane w ramach tego elementu injector
możemy wstrzyknąć sobie jakieś zależności dependency injection możemy dodać elementy
możemy zobaczyć czy są jakieś event listenery nasłuchujemy jakichś zdarzeń w tym
elemencie nazwa elementu tutaj możemy dostać się właśnie do tego zawartego
w środku tego czystego zwykłego elementu html bez tych angularowych
rzeczy jeśli to nie jest element tylko węzeł html tak samo
może się do niego dostać mamy rodzic właściwości i tutaj najciekawsze
rzeczy mamy coś takiego jak query query all i query all nodes i to
służy nam wyszukiwaniu elementów znajdujących się gdzieś
wewnątrz naszego debug elementu to możemy się zobaczyć czy istnieją jakieś referencje
czy są jakieś elementy oznaczone w angularze krzyżykiem do których mogliśmy
się dostać możemy usunąć element możemy style zobaczyć i tu też bardzo
fajna funkcja bo możemy zasymulować wywołanie
eventu ale nie natywnego ale eventu zdarzenia przeglądarki
to po prostu znaleź sobie jakiś event listener który jest podpięty i
zasymulować jego użycie takiego na przykład jak ktoś klikną w ten element albo klawisz wcisnął
albo jakiekolwiek inne zdarzenie inne html możemy sobie tutaj zasymulować
nie tylko html jeśli mamy jakiś event hander na przykład komponentów mają
swoje własne outputs czyli mają swoje emitery zdarzeń
to także możemy to tutaj zatriggerować czyli wykonać takie
zdarzenie i zobaczyć jak się nasz komponent zachowa okej zaczniemy z czymś prostym
spróbujemy poszukać tu jakiegoś elementu jak już widziałeś jeśli spróbujesz na przykład native
element wyświetlić powiedzmi inner html to już widzieliśmy to
nam wyświetlało po prostu html html
tego elementu tak czyli jak zrobię w ten sposób mamy html a
ja muszę być bardziej precyzyjny powiedzmy że w tym naszym komponencie znajduje
się tutaj troszeczkę więcej rzeczy powiedzmy że mamy tutaj jeden akapit drugi
trzeci i mnie nie interesuje na przykład ten środkowy message
to co możemy zrobić zamiast
pisać cały html tutaj native element
oczywiście można by się pokusić tu o selektory natywne czyli
na przykład query query selector i
zwykły selector tutaj css'owy wykorzystać ale pokaże ci taką metodę
bardziej angularową mamy tu właśnie query i
query zobacz wymaga nie selectora css tylko wymaga predykatu
ważniejsze że angular jest zaprojektowany jako framework uniwersalny czyli
tutaj te testy powinny działać z każdą inną platformą nie tylko z przeglądarką
na przykład była platforma mobilna na powiedzmy telefony mobilne
albo aplikacja desktopowa gdzie nie koniecznie mamy dom
niekoniecznie mamy html to jak widzisz możemy te elementy wyszukiwać na różne sposoby
różne rodzaje elementów musimy tu określić czego my szukamy i
ja też poszukam query by i by to jest klasa która mówi
no właśnie jakiego elementu jakie elementy chcemy wyszukiwać i
zobacz mamy tutaj by na przykład z selenium web driver
protractor mamy jakieś inne jeszcze tutaj z innych
pakietów ale my chcemy testować aplikacje przeglądarkową
taką która jest w przeglądarce internetowej jak widzisz mamy angular platform browser
czyli środowisko w którym chcemy to uruchamiać i stąd właśnie pobierzemy sobie
by jak tu wcisnę enter powinno mi automatycznie zaimportować
jeśli u ciebie się nie pojawiło to spróbuj dopisać sobie import tutaj by z angular
platform browser i tutaj mamy fajną opcję to jest funkcja
klasa która zawiera metody zobacz css i directive
czyli możemy wyszukiwać po sektorach css albo
jeśli w naszym komponencie znajduje się nie tylko html ale znajdują się inne komponenty
inne dyrektywy to nie musimy znać tutaj css żeby
do niej dostać nie musimy znać ścieżki css tylko możemy
od razu wyszukać sobie element my tu jeszcze nie mamy żadnych komponentów więc zacznijmy z czymś prostym
zaczniemy od szukania tutaj po css'ach i powiedzmy że wyszukamy
naszego message i teraz zobacz co zwraca nasz selector query to
selektor query zwraca kolejny element typu
debug element czyli jak widzisz mamy znowu takie fajne przydatne tutaj metody
czyli nie jesteśmy tutaj od razu ustawieni na sam html tylko nadal mamy te wszystkie
tutaj przydatne narzędzia mógłem od razu pobrać tutaj elementy a mówić
dalej query i jeszcze głębiej wyszukiwać jakiś elementów ja
na tym etapie tutaj zostanę z tym sobie przy native element
inner text tym razem razem i
zobaczmy co nam zwróci console log okej
jak widzisz tutaj mamy tylko tekst jeszcze
zmienimy go żeby zobaczyć na pewno ten element udało się znaleźć
tak mamy tylko ten element tam faktycznie w
ten sposób ten nowy test żeby tu
mamy it should create to zostawmy a kolejny test it should render minut będę
task powiedzmy name czyli
nasz message okej
czyli tu znajdziemy element const element message
i sprawdzimy czy element ma oczekujmy
czy tekst czy
jest równy i sprawdzamy czy to jest ten tekst
i jeśli zapisze to w tym momencie powinienem mieć błąd że
message works nie jest równe pustemu tekstowi jeśli
tu wpiszę message works mamy message works tutaj
też fajna rzecz bo nie tylko możemy szukać pojedynczego elementu mogę
wiele elementów znaleźć szukając query all
i tu spróbujemy nie po message którym po akapicie i zobaczymy co nam wyświetli tutaj
nasz obiekt elements tutaj widzisz w konsoli
niezbyt wygodne jak widzisz jest przeglądanie jakieś bardziej skomplikowane elementów więc
pokaż tobie też inny sposób debugowania jeśli chcesz zbadać jakiś skomplikowany element
albo jakąś logikę zobaczyć co tu się dzieje masz jakiś błąd w testach chciałbyś
debugować tu jest bardzo fajna rzecz ja mogę po prostu tutaj w którymś
miejscu w tekście którym chciałbym dowiedzieć się więcej użyć słówka
debugger i jeśli pojawi się w kodzie takie słówko i
otworzymy sobie to w naszej przeglądarce tu niestety nic się nie
dzieje bo jesteśmy jak widzisz w ramce się otwiera kod może
pokażę w ten sposób nasze testy uruchamiane są
tutaj w iframe czyli w ramce jeśli uruchomię ten przycisk debug
to tym razem jak widzisz testy uruchamiamy nie w ramce tylko
już samą ramkę tak nie jest ona opakowana jeszcze w ten dodatkowy
tutaj w tą bramkę i teraz jeśli wyjdę sobie z resources okej
tutaj zapiszę próbuje
się sam uruchomić ponownie f5 jak
widzisz tutaj zatrzymał mi się tutaj
zatrzymala się przeglądarka dokładnie w tej linii w której mam debugger i
mogę zdebugować te elementy mianowicie mam tutaj callstack
mogę dodać do watch jakąś zmienną przejdziemy
dalej przejdziemy dalej jak widzisz
elems wstawia trzy elementy mogę też najechać myszą po prostu i zobaczyć co się znajduje jak widzisz
mamy trzy razy debug element czyli ma wszystkie po kolei elementy
pierwszy akapit widzisz name drugi akapit i
drugi tutaj jak to zobaczymy sobie gdzieś styles classes classes
nie widać też ciekawa rzecz bo w każdej chwili mogę wziąć escape
zrobić tutaj konsole na przykładzie pokazujemy chrome podobnie
jest w firefox i tu oczywiście mamy zmianną elements to też
mogę sobie podejrzeć to w konsoli widzę jej stan na ten moment czyli
w ten sposób już możesz łatwo debugować sobie te testy zobaczyć krok po kroku co się u mnie dzieje może
podejrzeć stan zmiennych i zobaczyć dlaczego test pokazuje że coś
działa bo nie działa albo gdzie w którym momencie coś tutaj nam nie
idzie po naszej myśli okej czyli ja tutaj puszczę luzem a jak już teraz
elems mam wszystkie 3 elementy jeśli potrzebuję mogę całą kolekcję sobie znaleźć akurat
tego nie potrzebujemy więc tak sobie po zamykam żeby te testy działały
tutaj bez problemu okej czyli tutaj nie potrzebujemy
wszystkich to wykomentuje debugger też wykomentuje okej
message works super czyli jak widzisz
w ten sposób możesz bardzo łatwo znaleźć jeden lub więcej elementów
możesz zaś do środka tego elementu i sprawdzić czy on posiada odpowiednie
właśnie właściwości parametry nazwę klasy czy
na przykład tekst zawarty w środku czy równa się czy jest taki sam jak tekst
drugiego którego oczekiwaliśmy okej to tyle jak zauważyłeś
cały czas my renderujemy tekst statyczny nie ma
tu żadnej interaktywności nie ma żadnych tutaj renderowanych danych dynamicznie
więc w kolejnej lekcji zajmiemy się właśnie tym czyli tutaj wyświetlaniem
tutaj dynamicznych interpolacji tak więc do zobaczenia w kolejnej lekcji