{"id":12354,"date":"2021-12-20T07:00:44","date_gmt":"2021-12-20T06:00:44","guid":{"rendered":"https:\/\/sii.pl\/blog\/?p=12354"},"modified":"2025-05-07T13:05:32","modified_gmt":"2025-05-07T11:05:32","slug":"angular-jasmine-testowanie-serwisow-http-czesc-i-metoda-get","status":"publish","type":"post","link":"https:\/\/sii.pl\/blog\/angular-jasmine-testowanie-serwisow-http-czesc-i-metoda-get\/","title":{"rendered":"Angular\/Jasmine \u2013 testowanie serwis\u00f3w HTTP. Cz\u0119\u015b\u0107 I \u2013 metoda GET"},"content":{"rendered":"<p>Ka\u017cdy kod, kt\u00f3ry piszemy, mo\u017ce by\u0107 podatny na b\u0142\u0119dy. Tak\u017ce ten, kt\u00f3re jest napisany we frameworku takim jak np. Angular. W zwi\u0105zku z tym, dobrym nawykiem powinno sta\u0107 si\u0119 przygotowywanie test\u00f3w jednostkowych do naszego kodu.<!--more--> Testy, opr\u00f3cz tego, \u017ce zadbaj\u0105 o bezpiecze\u0144stwo i komfort pracy, to dodatkowo sprawi\u0105, \u017ce nasz kod b\u0119dzie mia\u0142 odpowiedni\u0105 dokumentacj\u0119. Dzi\u0119ki temu, je\u015bli do zespo\u0142u do\u0142\u0105czy nowy programista, nie b\u0119dzie musia\u0142 si\u0119 zastanawia\u0107, jakie by\u0142y za\u0142o\u017cenia biznesowe naszej aplikacji. Wykonuj\u0105c popraw\u0119 tego kodu, b\u0119dzie potrafi\u0142 odczyta\u0107 za pomoc\u0105 testu jednostkowego, co dana metoda zwraca, co robi i nic nie powinno go zaskoczy\u0107. Zyska swobod\u0119 nawet w przypadku bardziej skomplikowanych metod.<\/p>\n<h2>Wykorzystanie test\u00f3w w Angularze<\/h2>\n<p>Jednym ze sposob\u00f3w przetestowania serwisu w Angularze, korzystaj\u0105c z modu\u0142u HttpClient, jest u\u017cycie wbudowanego modu\u0142u <strong>HttpClientTestingModule <\/strong>i kontrolera <strong>HttpTestingController<\/strong>. U\u0142atwiaj\u0105 one testy serwisu i wykonywanie \u017c\u0105da\u0144 HTTP.<\/p>\n<p>Wszystkie testy w Angularze s\u0105 zapisywane w plikach z rozszerzeniem *.spec.ts. W naszym wypadku jest to serwis <strong>products.service.ts<\/strong> oraz plik z testami <strong>products.service.spec.ts<\/strong>. Nasz plik <strong>products.service.ts<\/strong> i jego kod zosta\u0142 przedstawiony poni\u017cej.<br \/><img decoding=\"async\" class=\"aligncenter wp-image-12373\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2021\/12\/ryc.1-1.png\" alt=\"\" width=\"750\" height=\"514\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2021\/12\/ryc.1-1.png 980w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2021\/12\/ryc.1-1-300x205.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2021\/12\/ryc.1-1-768x526.png 768w\" sizes=\"(max-width: 750px) 100vw, 750px\" \/><\/p>\n<h2>Testowanie w Angularze krok po kroku<\/h2>\n<p>Aby zacz\u0105\u0107 testowa\u0107 w Angularze:<\/p>\n<ol>\n<li>W pierwszej kolejno\u015bci nale\u017cy ustawi\u0107 <strong>TestBed <\/strong>naszego testowanego serwisu. W tym celu importujemy modu\u0142 <strong>HttpClientTestingModule<\/strong>, a do tablicy <strong>providers <\/strong>wstrzykujemy <strong>HttpTestingController<\/strong>.<br \/><img decoding=\"async\" class=\"aligncenter wp-image-12363\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2021\/12\/Ryc.2.png\" alt=\"\" width=\"750\" height=\"691\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2021\/12\/Ryc.2.png 853w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2021\/12\/Ryc.2-300x276.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2021\/12\/Ryc.2-768x708.png 768w\" sizes=\"(max-width: 750px) 100vw, 750px\" \/><\/li>\n<li>Musimy r\u00f3wnie\u017c pami\u0119ta\u0107 o wstrzykni\u0119ciu naszego serwisu, kt\u00f3ry chcemy przetestowa\u0107 \ud83d\ude42 Przypisujemy service do zmiennej let oraz wstrzykujemy go metod\u0105 inject.<br \/><img decoding=\"async\" class=\"aligncenter wp-image-12364\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2021\/12\/Ryc.3-1.png\" alt=\"\" width=\"750\" height=\"126\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2021\/12\/Ryc.3-1.png 852w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2021\/12\/Ryc.3-1-300x50.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2021\/12\/Ryc.3-1-768x129.png 768w\" sizes=\"(max-width: 750px) 100vw, 750px\" \/><\/li>\n<li>Kolejnym krokiem jest dodanie metody <strong>veryfiy()<\/strong> z <em>HttpTestingController<\/em> na ko\u0144cu ka\u017cdego testu. Upewniamy si\u0119 w ten spos\u00f3b, czy nie mamy \u017cadnych zaleg\u0142ych \u017c\u0105da\u0144 http. Mo\u017cemy to zrobi\u0107 w ka\u017cdym przypadku testowym osobno, tak jak w poni\u017cszym kodzie:<br \/><img decoding=\"async\" class=\"aligncenter wp-image-12365\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2021\/12\/Ryc.4.png\" alt=\"\" width=\"750\" height=\"365\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2021\/12\/Ryc.4.png 853w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2021\/12\/Ryc.4-300x146.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2021\/12\/Ryc.4-768x374.png 768w\" sizes=\"(max-width: 750px) 100vw, 750px\" \/><\/li>\n<li>Jednak lepsz\u0105 alternatyw\u0105, aby si\u0119 nie powtarza\u0107, jest dodanie tego sprawdzenia w bloku <strong>afterEach<\/strong>, kt\u00f3ry zostanie wykonany po ka\u017cdym przypadku testowym.<br \/><img decoding=\"async\" class=\"aligncenter wp-image-12366\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2021\/12\/Ryc.5.png\" alt=\"\" width=\"750\" height=\"96\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2021\/12\/Ryc.5.png 851w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2021\/12\/Ryc.5-300x38.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2021\/12\/Ryc.5-768x98.png 768w\" sizes=\"(max-width: 750px) 100vw, 750px\" \/><\/li>\n<\/ol>\n<h2>Testowanie \u017c\u0105dania GET krok po kroku<\/h2>\n<p>Teraz przysz\u0142a pora na przetestowanie \u017c\u0105dania. W tym miejscu zajmiemy si\u0119 metod\u0105 <strong>GET <\/strong>i napiszemy kilka przypadk\u00f3w testowych odno\u015bnie metody getProducts().<\/p>\n<ol>\n<li>Zaczynamy od sprawdzenia, czy nasze \u017c\u0105danie jest wywo\u0142ane za pomoc\u0105 metody GET.<br \/><img decoding=\"async\" class=\"aligncenter wp-image-12367\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2021\/12\/Ryc.6.png\" alt=\"\" width=\"750\" height=\"423\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2021\/12\/Ryc.6.png 852w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2021\/12\/Ryc.6-300x169.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2021\/12\/Ryc.6-768x433.png 768w\" sizes=\"(max-width: 750px) 100vw, 750px\" \/><\/li>\n<li>Aby to zrobi\u0107, subskrybujemy si\u0119 do naszej metody <strong>getProducts()<\/strong> z serwisu. Wywo\u0142ujemy adres \u017c\u0105dania do naszego API. Z pomoc\u0105 przychodzi nam metoda <strong>expectOne <\/strong>z <strong>httpTestingController.<\/strong><\/li>\n<li>Nast\u0119pnie sprawdzamy, czy nasze \u017c\u0105danie zosta\u0142o wys\u0142ane za pomoc\u0105 metody <strong>GET<\/strong>. W tej sytuacji przychodzi nam z pomoc\u0105 <strong>Jasmine <\/strong>i jego metody <strong>expect()<\/strong> oraz <strong>toBe()<\/strong>. Na poni\u017cszej grafice mo\u017cemy zauwa\u017cy\u0107, \u017ce funkcja dzia\u0142a prawid\u0142owo.<br \/><img decoding=\"async\" class=\"aligncenter size-full wp-image-12368\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2021\/12\/Ryc.7.png\" alt=\"\" width=\"463\" height=\"89\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2021\/12\/Ryc.7.png 463w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2021\/12\/Ryc.7-300x58.png 300w\" sizes=\"(max-width: 463px) 100vw, 463px\" \/><\/li>\n<\/ol>\n<h3>Dodatkowe testy sprawdzaj\u0105ce w metodzie GET<\/h3>\n<ul>\n<li>Innym testem, sprawdzaj\u0105cym nasz\u0105 metod\u0119 serwisu, jest poprawne odniesienie si\u0119 do naszego adresu URL wysy\u0142anego w \u017c\u0105daniu.<br \/><img decoding=\"async\" class=\"aligncenter wp-image-12369\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2021\/12\/Ryc.8.png\" alt=\"\" width=\"750\" height=\"336\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2021\/12\/Ryc.8.png 853w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2021\/12\/Ryc.8-300x134.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2021\/12\/Ryc.8-768x344.png 768w\" sizes=\"(max-width: 750px) 100vw, 750px\" \/><\/li>\n<\/ul>\n<p>Test jest podobny do tego, kt\u00f3rego u\u017cyli\u015bmy w pierwszym przypadku, z tym \u017ce tym razem w metodzie <strong>expect()<\/strong> sprawdzamy URL naszego \u017c\u0105dania zamiast wysy\u0142anej metody.<\/p>\n<ul>\n<li>Ostatnim testem godnym uwagi jest sprawdzenie, czy zosta\u0142y pobrane odpowiednie dane \u2013 w tym przypadku poprawna lista produkt\u00f3w.<br \/><img decoding=\"async\" class=\"aligncenter wp-image-12370 size-full\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2021\/12\/Ryc.9.png\" alt=\"\" width=\"732\" height=\"762\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2021\/12\/Ryc.9.png 732w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2021\/12\/Ryc.9-288x300.png 288w\" sizes=\"(max-width: 732px) 100vw, 732px\" \/><\/li>\n<\/ul>\n<p>Nale\u017cy przygotowa\u0107 w tym celu ma\u0142\u0105 list\u0119 produkt\u00f3w i, na przyk\u0142ad, przypisa\u0107 j\u0105 do zmiennej products. Przekazujemy t\u0119 list\u0105 do metody flush, kt\u00f3ra zapewnia nam fikcyjne dane jako warto\u015bci, a kt\u00f3re normalne przysz\u0142yby z serwera http.<\/p>\n<p>Po zasubskrybowaniu si\u0119 do naszego serwisu, mo\u017cemy zwr\u00f3ci\u0107 te dane i por\u00f3wna\u0107, czy s\u0105 identyczne z tym, co zadeklarowali\u015bmy.<\/p>\n<h2>Podsumowanie<\/h2>\n<p>Jak wida\u0107, testowanie naszego \u017c\u0105dania HTTP za pomoc\u0105 metody GET na pocz\u0105tku nie wydaje si\u0119 wcale takie trudne i mo\u017cna obs\u0142u\u017cy\u0107 kilka przypadk\u00f3w testowych.<\/p>\n<p>W kolejnych artyku\u0142ach powiemy sobie troszk\u0119 wi\u0119cej o testowaniu metod POST i DELETE oraz o obs\u0142udze przypadk\u00f3w, kiedy wyst\u0105pi jaki\u015b b\u0142\u0105d.<\/p>\n<p>\u00a0<\/p>\n<p>***<\/p>\n<h3>Pozosta\u0142e artyku\u0142y w serii:<\/h3>\n<p><a href=\"https:\/\/sii.pl\/blog\/angular-jasmine-testowanie-serwisow-http-czesc-ii-metody-post-put-oraz-delete\/?category=development-na-twardo&#038;tag=angular,testng\">Cz\u0119\u015b\u0107 II &#8211; metody POST, PUT oraz DELETE<\/a><br \/><a href=\"https:\/\/sii.pl\/blog\/angular-jasmine-testowanie-serwisow-http-czesc-iii-przechwytywanie-bledow\/?category=development-na-twardo&#038;tag=angular,jasmine,testng\">Cz\u0119\u015b\u0107 III &#8211; przechwytywanie b\u0142\u0119d\u00f3w<\/a><\/p>\n\n\n<p><\/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;12354&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;5&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;5\\\/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 I \u2013 metoda GET&quot;,&quot;width&quot;:&quot;139.5&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: 139.5px;\">\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            5\/5 ( votes: 6)    <\/div>\n    <\/div>\n","protected":false},"excerpt":{"rendered":"<p>Ka\u017cdy kod, kt\u00f3ry piszemy, mo\u017ce by\u0107 podatny na b\u0142\u0119dy. Tak\u017ce ten, kt\u00f3re jest napisany we frameworku takim jak np. Angular. &hellip; <a class=\"continued-btn\" href=\"https:\/\/sii.pl\/blog\/angular-jasmine-testowanie-serwisow-http-czesc-i-metoda-get\/\">Continued<\/a><\/p>\n","protected":false},"author":270,"featured_media":12376,"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":[2427,867,146],"class_list":["post-12354","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-development-na-twardo","tag-digital","tag-angular","tag-testing"],"acf":[],"aioseo_notices":[],"republish_history":[],"featured_media_url":"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2021\/12\/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\/12354"}],"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=12354"}],"version-history":[{"count":3,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/12354\/revisions"}],"predecessor-version":[{"id":17718,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/12354\/revisions\/17718"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media\/12376"}],"wp:attachment":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media?parent=12354"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/categories?post=12354"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/tags?post=12354"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}