{"id":13498,"date":"2022-04-22T07:00:29","date_gmt":"2022-04-22T05:00:29","guid":{"rendered":"https:\/\/sii.pl\/blog\/?p=13498"},"modified":"2025-05-07T13:01:48","modified_gmt":"2025-05-07T11:01:48","slug":"angular-jasmine-testowanie-serwisow-http-czesc-iii-przechwytywanie-bledow","status":"publish","type":"post","link":"https:\/\/sii.pl\/blog\/angular-jasmine-testowanie-serwisow-http-czesc-iii-przechwytywanie-bledow\/","title":{"rendered":"Angular\/Jasmine \u2013 testowanie serwis\u00f3w HTTP. Cz\u0119\u015b\u0107 III \u2013 przechwytywanie b\u0142\u0119d\u00f3w"},"content":{"rendered":"\n<p>Z ostatniego ju\u017c artyku\u0142u serii na temat testowania serwis\u00f3w http w Angular dowiecie si\u0119 wi\u0119cej na temat przechwytywanie b\u0142\u0119d\u00f3w i testowanie b\u0142\u0119dnych odpowiedzi z serwera.<\/p>\n\n\n\n<p>Je\u015bli interesuje Was ta tematyka, to zach\u0119cam do przeczytania dw\u00f3ch pozosta\u0142ych artyku\u0142\u00f3w, jakie zaprezentowa\u0142em do tej pory. Dotycz\u0105 testowania serwis\u00f3w http we frameworku Angular. Oczywi\u015bcie, wszystkie testy by\u0142y pisane za pomoc\u0105 <strong>Karma<\/strong> oraz <strong>Jasmine<\/strong>. Pierwszy artyku\u0142 opisywa\u0142 <a href=\"https:\/\/sii.pl\/blog\/angular-jasmine-testowanie-serwisow-http-czesc-i-metoda-get\/?category=development-na-twardo&amp;tag=angular,software-development,testng\">testowania serwis\u00f3w http za pomoc\u0105 metody GET<\/a>. W drugim skupi\u0142em si\u0119 na <a href=\"https:\/\/sii.pl\/blog\/angular-jasmine-testowanie-serwisow-http-czesc-ii-metody-post-put-oraz-delete\/?category=development-na-twardo&amp;tag=angular,testng\">trzech pozosta\u0142ych metodach naszego CRUD-a, czyli PUT, DELETE oraz POST<\/a>, a tak\u017ce tym, w jaki spos\u00f3b mo\u017cna napisa\u0107 do nich przypadki testowe.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">RxJS i operator catchError<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Zacznijmy od tego w jaki spos\u00f3b mo\u017cemy za pomoc\u0105 Angulara przechwyci\u0107 b\u0142\u0105d, je\u017celi co\u015b po drodze p\u00f3jdzie nie tak, jak by\u015bmy chcieli. Przecie\u017c nie zawsze b\u0119dziemy mieli nasz przys\u0142owiowy \u201ehappy path\u201d, gdzie uzyskamy poprawne dane.<\/li>\n\n\n\n<li>Z pomoc\u0105 przychodzi operator <strong>RxJS \u2013 catchError<\/strong>, kt\u00f3ry mo\u017cemy dopisa\u0107 do naszego serwisu i przechwyci\u0107 w nim b\u0142\u0105d oraz co\u015b zwr\u00f3ci\u0107. Przyk\u0142adowo w naszym wypadku b\u0119dzie to komunikat tekstowy, \u017ce co\u015b wydarzy\u0142o si\u0119 \u017ale.<\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-image aligncenter\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/04\/1..png\"><img decoding=\"async\" width=\"677\" height=\"527\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/04\/1..png\" alt=\"fragment kodu\" class=\"wp-image-13499\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/04\/1..png 677w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/04\/1.-300x234.png 300w\" sizes=\"(max-width: 677px) 100vw, 677px\" \/><\/a><\/figure>\n\n\n\n<ol class=\"wp-block-list\" start=\"3\">\n<li>Teraz, gdy nasz komponent skorzysta z serwisu ProductsService i wywo\u0142amy na nim metod\u0119 getProducts, a serwer odpowie nam b\u0142\u0119dnie, to zachowanie to zostanie przechwycone przez nasz operator<\/li>\n\n\n\n<li>Wewn\u0105trz catchError mo\u017cemy odebra\u0107 b\u0142\u0105d o typie HttpErrorResponse z Angulara, kt\u00f3ry zawiera m.in. status b\u0142\u0119du, statusText, url itp.<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">Przechwycenie wiadomo\u015bci o b\u0142\u0119dzie<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Nasz pierwszy przypadek testowy zaczniemy od sprawdzenia, czy podczas wys\u0142ania \u017c\u0105dania i niepowodzenia dostaniemy odpowiedni komunikat tekstowy.<\/li>\n\n\n\n<li>Tym razem do metody flush, przeka\u017cemy dwa argumenty. Pierwszy z list\u0105 produkt\u00f3w \u2013 w tym wypadku pusty obiekt \u2013 oraz drugi argument, czyli odpowied\u017a z serwera z b\u0142\u0119dem, zawieraj\u0105cy takie klucze jak <strong>status<\/strong> czy <strong>statusText<\/strong>.<\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-image aligncenter\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/04\/2.png\"><img decoding=\"async\" width=\"679\" height=\"443\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/04\/2.png\" alt=\"fragment kodu\" class=\"wp-image-13500\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/04\/2.png 679w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/04\/2-300x196.png 300w\" sizes=\"(max-width: 679px) 100vw, 679px\" \/><\/a><\/figure>\n\n\n\n<ol class=\"wp-block-list\" start=\"3\">\n<li>Poniewa\u017c w naszym serwisie zwr\u00f3cili\u015bmy poprzez <strong>throw<\/strong> obiekt jak poni\u017cej, to po zasubskrybowaniu si\u0119 i odebraniu b\u0142\u0119du, mo\u017cemy przechwyci\u0107 tekst naszego b\u0142\u0119du pod kluczem <strong>message<\/strong>.<\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-image aligncenter\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/04\/3.png\"><img decoding=\"async\" width=\"652\" height=\"150\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/04\/3.png\" alt=\"fragment kodu\" class=\"wp-image-13501\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/04\/3.png 652w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/04\/3-300x69.png 300w\" sizes=\"(max-width: 652px) 100vw, 652px\" \/><\/a><\/figure>\n\n\n\n<ol class=\"wp-block-list\" start=\"4\">\n<li>Nasz pierwszy test przeszed\u0142 pomy\u015blnie i odebrali\u015bmy oczekiwany komunikat.<\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-image aligncenter\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/04\/4.png\"><img decoding=\"async\" width=\"678\" height=\"193\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/04\/4.png\" alt=\"fragment kodu\" class=\"wp-image-13502\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/04\/4.png 678w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/04\/4-300x85.png 300w\" sizes=\"(max-width: 678px) 100vw, 678px\" \/><\/a><\/figure>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Kod odpowiedzi serwera HTTP np. 404, 500, itp.<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li>W drugim przypadku testowym spr\u00f3bujemy przechwyci\u0107 kod odpowiedzi http.<\/li>\n\n\n\n<li>W Rest API mo\u017cemy je podzieli\u0107 na 5 rodzaj\u00f3w:\n<ul class=\"wp-block-list\">\n<li>1xx \u2013 kody informacyjne,<\/li>\n\n\n\n<li>2xx \u2013 kody powodzenia,<\/li>\n\n\n\n<li>3xx \u2013 kody przekierowania,<\/li>\n\n\n\n<li>4xx \u2013 kody b\u0142\u0119du po stronie klienta\/aplikacji,<\/li>\n\n\n\n<li>5xx \u2013 kody b\u0142\u0119du po stronie serwera.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<ol class=\"wp-block-list\" start=\"3\">\n<li>Skoro chcemy przychwyci\u0107 b\u0142\u0105d, skupimy si\u0119 na kodach b\u0142\u0119du po stronie klienta. W naszym przypadku testowym, przeka\u017cemy do metody <strong>flush<\/strong> kod, kt\u00f3ry dostaniemy w odpowiedzi. Tym razem b\u0119dzie to status 404 \u2013 Not Found.<\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-image aligncenter\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/04\/5.png\"><img decoding=\"async\" width=\"679\" height=\"444\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/04\/5.png\" alt=\"fragment kodu\" class=\"wp-image-13503\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/04\/5.png 679w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/04\/5-300x196.png 300w\" sizes=\"(max-width: 679px) 100vw, 679px\" \/><\/a><\/figure>\n\n\n\n<ol class=\"wp-block-list\" start=\"4\">\n<li>Tym razem, gdy dokonamy subskrypcji do metody <strong>getProducts, <\/strong>w odpowiedzi mo\u017cemy sprawdzi\u0107 czy dostajemy prawid\u0142owy kod odpowiedzi pod kluczem<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">Status odpowiedzi serwera HTTP<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Ostatnim przypadkiem testowym, kt\u00f3ry sprawdzimy, b\u0119dzie zwr\u00f3cenie poprawnego statusu odpowiedzi z serwera.<\/li>\n\n\n\n<li>Tutaj tak\u017ce przygotujemy nasze dane i wstrzykniemy je do metody flush czyli <strong>status <\/strong>oraz <strong>statusText<\/strong>.<\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-image aligncenter\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/04\/6.png\"><img decoding=\"async\" width=\"678\" height=\"444\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/04\/6.png\" alt=\"fragment kodu\" class=\"wp-image-13504\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/04\/6.png 678w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/04\/6-300x196.png 300w\" sizes=\"(max-width: 678px) 100vw, 678px\" \/><\/a><\/figure>\n\n\n\n<ol class=\"wp-block-list\" start=\"3\">\n<li>Tym razem w odpowiedzi odbierzemy informacj\u0119 tekstow\u0105 <strong>Not Found<\/strong>, kt\u00f3ra przysz\u0142aby z serwera, gdyby\u015bmy dostali kod b\u0142\u0119du <strong>404<\/strong>.<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">Podsumowanie<\/h2>\n\n\n\n<p>To ju\u017c wszystkie najwa\u017cniejsze informacje na temat testowania serwis\u00f3w http za pomoc\u0105 frameworku Angular, o kt\u00f3rych warto wspomnie\u0107.<\/p>\n\n\n\n<p>Nasze zapytania http mo\u017cemy testowa\u0107 na wszelkie sposoby np.:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>sprawdzi\u0107 metody takie jak <strong>GET<\/strong>, <strong>POST<\/strong>, <strong>PUT<\/strong> czy <strong>DELETE<\/strong>,<\/li>\n\n\n\n<li>sprawdzi\u0107, czy wysy\u0142amy \u017c\u0105danie pod poprawny adres url.<\/li>\n\n\n\n<li>Sprawdzi\u0107, czy zosta\u0142y pobrane odpowiednie dane z backendu,<\/li>\n\n\n\n<li>Sprawdzi\u0107, czy odpowiednie dane zosta\u0142y zaktualizowane.<\/li>\n<\/ul>\n\n\n\n<p>A na sam koniec pozostaje testowanie b\u0142\u0119d\u00f3w i sprawdzenie co si\u0119 wydarzy, je\u017celi backend ode\u015ble nam b\u0142\u0119dne informacje.<\/p>\n\n\n\n<p>Zach\u0119cam do dalszego testowania swoich aplikacji i sprawdzania ich pod r\u00f3\u017cnymi k\u0105tami przy pomocy test\u00f3w jednostkowych.<\/p>\n\n\n\n<p>***<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Pozosta\u0142e artyku\u0142y w serii:<\/h3>\n\n\n\n<p><a href=\"https:\/\/sii.pl\/blog\/angular-jasmine-testowanie-serwisow-http-czesc-i-metoda-get\/?category=development-na-twardo&amp;tag=angular,software-development,testng\">Cz\u0119\u015b\u0107 I &#8211; metoda GET<\/a><br><a href=\"https:\/\/sii.pl\/blog\/angular-jasmine-testowanie-serwisow-http-czesc-ii-metody-post-put-oraz-delete\/?category=development-na-twardo&amp;tag=angular,testng\">Cz\u0119\u015b\u0107 II &#8211; metody POST, PUT oraz DELETE<\/a><\/p>\n\n\n<div class=\"kk-star-ratings kksr-auto kksr-align-left kksr-valign-bottom\"\n    data-payload='{&quot;align&quot;:&quot;left&quot;,&quot;id&quot;:&quot;13498&quot;,&quot;slug&quot;:&quot;default&quot;,&quot;valign&quot;:&quot;bottom&quot;,&quot;ignore&quot;:&quot;&quot;,&quot;reference&quot;:&quot;auto&quot;,&quot;class&quot;:&quot;&quot;,&quot;count&quot;:&quot;6&quot;,&quot;legendonly&quot;:&quot;&quot;,&quot;readonly&quot;:&quot;&quot;,&quot;score&quot;:&quot;3.7&quot;,&quot;starsonly&quot;:&quot;&quot;,&quot;best&quot;:&quot;5&quot;,&quot;gap&quot;:&quot;11&quot;,&quot;greet&quot;:&quot;&quot;,&quot;legend&quot;:&quot;3.7\\\/5 ( votes: 6)&quot;,&quot;size&quot;:&quot;18&quot;,&quot;title&quot;:&quot;Angular\\\/Jasmine \u2013 testowanie serwis\u00f3w HTTP. Cz\u0119\u015b\u0107 III \u2013 przechwytywanie b\u0142\u0119d\u00f3w&quot;,&quot;width&quot;:&quot;101.8&quot;,&quot;_legend&quot;:&quot;{score}\\\/{best} ( {votes}: {count})&quot;,&quot;font_factor&quot;:&quot;1.25&quot;}'>\n            \n<div class=\"kksr-stars\">\n    \n<div class=\"kksr-stars-inactive\">\n            <div class=\"kksr-star\" data-star=\"1\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"2\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"3\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"4\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"5\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n    <\/div>\n    \n<div class=\"kksr-stars-active\" style=\"width: 101.8px;\">\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n    <\/div>\n<\/div>\n                \n\n<div class=\"kksr-legend\" style=\"font-size: 14.4px;\">\n            3.7\/5 ( votes: 6)    <\/div>\n    <\/div>\n","protected":false},"excerpt":{"rendered":"<p>Z ostatniego ju\u017c artyku\u0142u serii na temat testowania serwis\u00f3w http w Angular dowiecie si\u0119 wi\u0119cej na temat przechwytywanie b\u0142\u0119d\u00f3w i &hellip; <a class=\"continued-btn\" href=\"https:\/\/sii.pl\/blog\/angular-jasmine-testowanie-serwisow-http-czesc-iii-przechwytywanie-bledow\/\">Continued<\/a><\/p>\n","protected":false},"author":270,"featured_media":13506,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_editorskit_title_hidden":false,"_editorskit_reading_time":0,"_editorskit_is_block_options_detached":false,"_editorskit_block_options_position":"{}","inline_featured_image":false,"footnotes":""},"categories":[1314],"tags":[867,1247,146],"class_list":["post-13498","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-development-na-twardo","tag-angular","tag-jasmine","tag-testing"],"acf":[],"aioseo_notices":[],"republish_history":[],"featured_media_url":"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/04\/Angular-i-Jasmine-Testowanie-serwisow-HTTP-metoda-GET.png","category_names":["Development na twardo"],"_links":{"self":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/13498"}],"collection":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/users\/270"}],"replies":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/comments?post=13498"}],"version-history":[{"count":1,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/13498\/revisions"}],"predecessor-version":[{"id":24876,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/13498\/revisions\/24876"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media\/13506"}],"wp:attachment":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media?parent=13498"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/categories?post=13498"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/tags?post=13498"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}