{"id":30591,"date":"2023-05-24T12:34:41","date_gmt":"2023-05-24T10:34:41","guid":{"rendered":"https:\/\/nearshore-it.eu\/artykuly\/testowanie-rxjs-marble-testing\/"},"modified":"2024-11-07T14:05:40","modified_gmt":"2024-11-07T13:05:40","slug":"testowanie-rxjs-marble-testing","status":"publish","type":"post","link":"https:\/\/nearshore-it.eu\/pl\/artykuly\/testowanie-rxjs-marble-testing\/","title":{"rendered":"Marble testing \u2013 wszystko o testowaniu RxJS"},"content":{"rendered":"\n<div class=\"table-of-contents\">\n    <p class=\"title\">PRZEJD\u0179 DO:<\/p>\n    <ol>\n                    <li><a href=\"#RxJS-observables\">1.  RxJS observables <\/a><\/li>\n                    <li><a href=\"#Czym-jest-testowanie-R\">2.  Czym jest testowanie RxJS (marble testing w RxJS)? <\/a><\/li>\n                    <li><a href=\"#-przypadki-testowe-RxJS?u002du002d\">3.  Jak pisa\u0107 przypadki testowe RxJS?  <\/a><\/li>\n                    <li><a href=\"#-jest-marble-diagram-w-RxJS?-\">4.  Czym jest marble diagram w RxJS? <\/a><\/li>\n                    <li><a href=\"#diagramy-marble-w-RxJS?-\">5.   Jakie s\u0105 rodzaje test\u00f3w marble w RxJS? <\/a><\/li>\n                    <li><a href=\"#ci-z-testowania-RxJS?\">6.  Jakie s\u0105 korzy\u015bci z testowania RxJS? <\/a><\/li>\n                    <li><a href=\"#FAQ\">7.  FAQ<\/a><\/li>\n            <\/ol>\n<\/div>\n\n\n<h2 class=\"wp-block-heading\" id=\"RxJS-observables\">RxJS observables<\/h2>\n\n\n\n<p>RxJS to biblioteka do tworzenia asynchronicznych strumieni danych, zarz\u0105dzania nimi oraz obs\u0142ugiwania zdarze\u0144 w aplikacjach JavaScript. <strong>Kluczowym elementem RxJS s\u0105 observable<\/strong>, kt\u00f3re reprezentuj\u0105 strumienie danych emitowane w czasie.<\/p>\n\n\n\n<p>Observable opieraj\u0105 si\u0119 na wzorcu projektowym Obserwator, w kt\u00f3rym obserwator \u201esubskrybuje\u201d obserwowany obiekt i oczekuje na emitowane przez niego dane. RxJS oferuje r\u00f3\u017cnorodne operatory, takie jak map, filter czy merge, kt\u00f3re pozwalaj\u0105 na przekszta\u0142canie, filtrowanie i \u0142\u0105czenie strumieni danych.<\/p>\n\n\n\n<p>Szerzej koncepcja biblioteki RxJS zosta\u0142a opisana w artykule <a href=\"https:\/\/nearshore-it.eu\/pl\/artykuly\/programowanie-reaktywne-w-js-z-rxjs\" target=\"_blank\" data-type=\"URL\" data-id=\"https:\/\/nearshore-it.eu\/pl\/artykuly\/programowanie-reaktywne-w-js-z-rxjs\" rel=\"noreferrer noopener\">Programowanie reaktywne z JavaScript w RxJS.<\/a><\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"Czym-jest-testowanie-R\">Czym jest testowanie RxJS (marble testing w RxJS)?<\/h2>\n\n\n\n<p>RxJS umo\u017cliwia reaktywne programowanie w JavaScript, dzi\u0119ki czemu mo\u017cna obs\u0142ugiwa\u0107 asynchroniczne strumienie danych oraz manipulowa\u0107 nimi za pomoc\u0105 r\u00f3\u017cnych operacji, takich jak mapowanie, filtrowanie czy \u0142\u0105czenie. Testowanie RxJS ma na celu zapewnienie, \u017ce kod dzia\u0142aj\u0105cy na tych strumieniach jest poprawny, wolny od b\u0142\u0119d\u00f3w i spe\u0142nia oczekiwania.&nbsp;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Marble testing&nbsp;<\/h3>\n\n\n\n<p>W kontek\u015bcie testowania RxJS warto wspomnie\u0107 o <strong>marble testing<\/strong>, kt\u00f3re jest jednym z popularnych narz\u0119dzi do testowania strumieni danych w tej bibliotece. Marble testing to nic innego jak wizualizacja strumieni danych za pomoc\u0105 tzw. marble diagrams. W marble strumienie danych <strong>reprezentowane s\u0105 jako ci\u0105gi znak\u00f3w<\/strong>, gdzie ka\u017cdy znak symbolizuje warto\u015b\u0107 w strumieniu lub specjalne zdarzenie, takie jak zako\u0144czenie strumienia czy wyst\u0105pienie b\u0142\u0119du. Testowanie z u\u017cyciem diagram\u00f3w marble pozwala na definiowanie oczekiwanych wynik\u00f3w oraz por\u00f3wnywanie ich z rzeczywistymi wynikami testowania, co jest szczeg\u00f3lnie przydatne w przypadku z\u0142o\u017conych operacji asynchronicznych.&nbsp;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Rodzaje test\u00f3w<\/h3>\n\n\n\n<p>Testowanie RxJS, zw\u0142aszcza z wykorzystaniem diagram\u00f3w marble,<strong> pozwala na weryfikacj\u0119 poprawno\u015bci dzia\u0142ania funkcji i operator\u00f3w reaktywnych <\/strong>w kontek\u015bcie test\u00f3w jednostkowych. Testy jednostkowe koncentruj\u0105 si\u0119 na ocenie pojedynczych funkcji, operator\u00f3w oraz strumieni danych. Ich celem jest izolowanie poszczeg\u00f3lnych element\u00f3w kodu i sprawdzenie, czy zachowuj\u0105 si\u0119 zgodnie z oczekiwaniami.<\/p>\n\n\n\n<p><strong>Przeczytaj tak\u017ce:<\/strong> <a href=\"https:\/\/nearshore-it.eu\/pl\/artykuly\/narzedzia-automatyzacji-testow\/\">Narz\u0119dzia automatyzacji test\u00f3w czy&nbsp;dobre praktyki? Jak przyspieszy\u0107 testowanie?<\/a><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Narz\u0119dzia testowania RxJS&nbsp;<\/h3>\n\n\n\n<p>W celu u\u0142atwienia testowania z u\u017cyciem diagram\u00f3w marble biblioteka RxJS udost\u0119pnia takie narz\u0119dzia jak <strong>TestScheduler<\/strong>, kt\u00f3ry pozwala na kontrolowanie czasu w wirtualny spos\u00f3b &#8211; bez wp\u0142ywu na rzeczywisty czas wykonywania test\u00f3w. TestScheduler umo\u017cliwia definiowanie warto\u015bci wej\u015bciowych i oczekiwanych warto\u015bci wyj\u015bciowych za pomoc\u0105 marble diagrams, a nast\u0119pnie symuluje przep\u0142yw danych w strumieniach reaktywnych.&nbsp;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"-przypadki-testowe-RxJS?--\">Jak pisa\u0107 przypadki testowe RxJS?&nbsp;&nbsp;<\/h2>\n\n\n\n<p>Pisanie przypadk\u00f3w testowych RxJS wymaga starannego planowania, zrozumienia kodu \u017ar\u00f3d\u0142owego oraz wykorzystania odpowiednich narz\u0119dzi do testowania. Marble testing to jedno z podej\u015b\u0107, kt\u00f3re pomaga w tworzeniu przejrzystych test\u00f3w dla strumieni danych. Oto kilka wskaz\u00f3wek, jak napisa\u0107 testy dla kodu opartego na bibliotece RxJS:&nbsp;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">1. Zapoznaj si\u0119 z kodem \u017ar\u00f3d\u0142owym&nbsp;<\/h3>\n\n\n\n<p>Przed przyst\u0105pieniem do pisania przypadk\u00f3w testowych dok\u0142adnie zapoznaj si\u0119 z kodem \u017ar\u00f3d\u0142owym, kt\u00f3ry b\u0119dzie testowany. Zrozumienie struktury kodu oraz celu poszczeg\u00f3lnych funkcji i operator\u00f3w pozwoli na opracowanie skutecznych i kompleksowych test\u00f3w.&nbsp;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">2. Wybierz odpowiedni framework do testowania&nbsp;<\/h3>\n\n\n\n<p>Wybierz framework do testowania kodu JavaScript, taki jak Jasmine, Mocha czy Jest, kt\u00f3ry najlepiej odpowiada twoim potrzebom i preferencjom. Upewnij si\u0119, \u017ce wybrany framework wsp\u00f3\u0142pracuje z RxJS i pozwala na wykorzystanie marble testing, je\u015bli planujesz korzysta\u0107 z tego podej\u015bcia.&nbsp;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">3. Utw\u00f3rz struktur\u0119 test\u00f3w&nbsp;<\/h3>\n\n\n\n<p>Testy jednostkowe zwykle s\u0105 organizowane w blokach <strong>describe <\/strong>(lub podobnych, w zale\u017cno\u015bci od u\u017cywanego frameworka), kt\u00f3re s\u0142u\u017c\u0105 do grupowania test\u00f3w dotycz\u0105cych okre\u015blonej funkcji, operatora lub komponentu. Wewn\u0105trz blok\u00f3w describe umieszczamy poszczeg\u00f3lne przypadki testowe, zdefiniowane za pomoc\u0105 funkcji <strong>it <\/strong>(lub odpowiednika w wybranym frameworku).&nbsp;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">4. Zastosuj marble testing&nbsp;<\/h3>\n\n\n\n<p>Marble testing to podej\u015bcie, kt\u00f3re pozwala na wizualizacj\u0119 strumieni danych za pomoc\u0105 tzw. marble diagrams. W marble testing strumienie danych reprezentowane s\u0105 jako ci\u0105gi znak\u00f3w, gdzie ka\u017cdy znak symbolizuje warto\u015b\u0107 w strumieniu lub specjalne zdarzenie, takie jak zako\u0144czenie strumienia czy wyst\u0105pienie b\u0142\u0119du.&nbsp;<\/p>\n\n\n\n<p>W przypadku testowania RxJS z wykorzystaniem marble testing u\u017cyj narz\u0119dzi dostarczanych przez bibliotek\u0119, takich jak TestScheduler. TestScheduler pozwala na kontrolowanie czasu w spos\u00f3b wirtualny oraz definiowanie warto\u015bci wej\u015bciowych i oczekiwanych warto\u015bci wyj\u015bciowych za pomoc\u0105 marble diagrams.&nbsp;&nbsp;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">5. Zdefiniuj przypadki testowe&nbsp;<\/h3>\n\n\n\n<p>Przypadki testowe powinny by\u0107 zdefiniowane w spos\u00f3b czytelny i zrozumia\u0142y, opisuj\u0105c oczekiwane zachowanie funkcji, operatora lub strumienia danych. Wykorzystuj\u0105c marble testing, mo\u017cesz precyzyjnie i czytelnie opisa\u0107 oczekiwane zachowanie strumieni danych oraz por\u00f3wna\u0107 rzeczywiste wyniki z oczekiwanymi.&nbsp;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">6. Testuj r\u00f3\u017cne przypadki i scenariusze&nbsp;<\/h3>\n\n\n\n<p>Podczas pisania przypadk\u00f3w testowych warto przetestowa\u0107 r\u00f3\u017cne scenariusze, takie jak:&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Przep\u0142yw danych o r\u00f3\u017cnych warto\u015bciach&nbsp;<\/li>\n\n\n\n<li>Przep\u0142yw danych z op\u00f3\u017anieniami lub interwa\u0142ami&nbsp;<\/li>\n\n\n\n<li>Zachowanie kodu w przypadku wyst\u0105pienia b\u0142\u0119d\u00f3w&nbsp;<\/li>\n\n\n\n<li>Zako\u0144czenie strumieni danych&nbsp;<\/li>\n\n\n\n<li>W\u0142a\u015bciwe przekazywanie warto\u015bci do kolejnych operator\u00f3w&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Spr\u00f3buj tak\u017ce uwzgl\u0119dni\u0107 przypadki brzegowe, aby upewni\u0107 si\u0119, \u017ce testowany kod jest odporny na r\u00f3\u017cne sytuacje.&nbsp;<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">7. Przegl\u0105daj i ulepszaj przypadki testowe&nbsp;<\/h3>\n\n\n\n<p>Regularnie przegl\u0105daj swoje przypadki testowe, aby upewni\u0107 si\u0119, \u017ce s\u0105 aktualne i nadal spe\u0142niaj\u0105 swoje zadanie. Spr\u00f3buj zoptymalizowa\u0107 testy, eliminuj\u0105c powtarzalne lub zb\u0119dne fragmenty kodu, a tak\u017ce u\u0142atwiaj\u0105c jego czytanie i zrozumienie. Dzi\u0119ki temu utrzymanie i rozw\u00f3j test\u00f3w b\u0119d\u0105 \u0142atwiejsze w miar\u0119 wprowadzania zmian w kodzie \u017ar\u00f3d\u0142owym.&nbsp;<\/p>\n\n\n\n<p>Pisanie przypadk\u00f3w testowych RxJS, zw\u0142aszcza z wykorzystaniem marble testing, wymaga zrozumienia struktury kodu, wyboru odpowiedniego frameworka do testowania, tworzenia struktury test\u00f3w oraz definiowania przypadk\u00f3w testowych, kt\u00f3re precyzyjnie opisuj\u0105 oczekiwane zachowanie strumieni danych. Dzi\u0119ki stosowaniu tych wskaz\u00f3wek b\u0119dziesz w stanie tworzy\u0107 czytelne i skuteczne testy jednostkowe dla swojego kodu opartego na bibliotece RxJS.&nbsp;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"-jest-marble-diagram-w-RxJS?-\">Czym jest marble diagram w RxJS?&nbsp;<\/h2>\n\n\n\n<p>Diagramy marble to wizualne reprezentacje strumieni danych w bibliotece RxJS, kt\u00f3re pomagaj\u0105 zrozumie\u0107 przep\u0142yw danych oraz interakcje mi\u0119dzy operacjami na strumieniach. Wprowadzenie diagram\u00f3w marble do procesu wytwarzania oprogramowania z RxJS mo\u017ce poprawi\u0107 czytelno\u015b\u0107 kodu, u\u0142atwi\u0107 komunikacj\u0119 mi\u0119dzy programistami oraz przyspieszy\u0107 proces wdra\u017cania test\u00f3w.&nbsp;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"diagramy-marble-w-RxJS?-\">Jak odczytywa\u0107 diagramy marble w RxJS?&nbsp;<\/h2>\n\n\n\n<p>Diagramy marble u\u017cywaj\u0105 znak\u00f3w do przedstawienia warto\u015bci emitowanych przez strumie\u0144, zako\u0144czenia strumienia, wyst\u0105pienia b\u0142\u0119du oraz subskrypcji i jej anulowania. Oto kilka dodatkowych wskaz\u00f3wek, jak odczytywa\u0107 diagramy:&nbsp;<\/p>\n\n\n\n<p><strong>Czas:<\/strong> ka\u017cdy my\u015blnik (<strong>&#8211;<\/strong>) oznacza jednostk\u0119 czasu, zwan\u0105 r\u00f3wnie\u017c \u201eramk\u0105\u201d. W testach marble d\u0142ugo\u015b\u0107 ramki czasowej jest zdefiniowana w narz\u0119dziu TestScheduler, co pozwala na kontrolowanie up\u0142ywu czasu w te\u015bcie.&nbsp;<\/p>\n\n\n\n<p><strong>Warto\u015bci:<\/strong> znaki alfanumeryczne (np.<strong> a, b, c<\/strong>) reprezentuj\u0105 warto\u015bci emitowane przez strumie\u0144 danych. Warto\u015bci te s\u0105 zazwyczaj zdefiniowane w obiekcie warto\u015bci przekazywanym do metody <strong>toBe()<\/strong>, kt\u00f3ry mapuje te znaki na rzeczywiste warto\u015bci.&nbsp;<\/p>\n\n\n\n<p><strong>Subskrypcja i anulowanie subskrypcji: <\/strong>w Marble mo\u017cemy u\u017cy\u0107 symbolu <strong>^<\/strong> do oznaczenia momentu, w kt\u00f3rym subskrypcja si\u0119 rozpoczyna, oraz <strong>!<\/strong> do oznaczenia momentu, w kt\u00f3rym zostaje anulowana.&nbsp;<\/p>\n\n\n\n<p><strong>Przyk\u0142adowy diagram marble dla RxJS mo\u017ce wygl\u0105da\u0107 tak:<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">---a---b---c---| \n <\/pre>\n\n\n\n<p>Ten diagram reprezentuje strumie\u0144 danych, kt\u00f3ry emituje trzy warto\u015bci: a, b, c, ka\u017cda z nich emitowana w r\u00f3wnych odst\u0119pach czasu. Ostatni symbol, |, oznacza, \u017ce strumie\u0144 zosta\u0142 zako\u0144czony po emisji c.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">---a---b---c---| \n\n        map(x => x.toUpperCase()) \n\n---A---B---C---| <\/pre>\n\n\n\n<p>W tym przypadku mamy strumie\u0144 wej\u015bciowy, kt\u00f3ry emituje warto\u015bci <strong>a<\/strong>, <strong>b<\/strong>, <strong>c<\/strong>. Nast\u0119pnie zastosowali\u015bmy operator map, kt\u00f3ry przekszta\u0142ca ka\u017cd\u0105 emitowan\u0105 warto\u015b\u0107 na jej odpowiednik z du\u017c\u0105 liter\u0105. Wynikowy strumie\u0144 emituje wi\u0119c warto\u015bci <strong>A<\/strong>, <strong>B<\/strong>, <strong>C<\/strong>.&nbsp;<\/p>\n\n\n\n<p>Diagramy marble mog\u0105 by\u0107 znacznie bardziej skomplikowane, z wieloma operatorami i zdarzeniami. Kluczowe jest zrozumienie podstawowej notacji, aby m\u00f3c interpretowa\u0107 i tworzy\u0107 takie diagramy.&nbsp;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Jakie s\u0105 rodzaje test\u00f3w marble w RxJS?<\/h2>\n\n\n\n<p>Testy marble w RxJS dzielimy na dwa g\u0142\u00f3wne rodzaje: testy jednostkowe i testy integracyjne.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Testy jednostkowe<\/h3>\n\n\n\n<p>Skupiaj\u0105 si\u0119 na izolowaniu i testowaniu indywidualnych komponent\u00f3w, operator\u00f3w lub funkcji. Marble testing jest bardzo przydatne w testach jednostkowych, poniewa\u017c pozwala na precyzyjne sprawdzanie sekwencji zdarze\u0144 oraz efekt\u00f3w poszczeg\u00f3lnych operator\u00f3w na strumieniach danych. W testach jednostkowych korzystamy z TestScheduler, kt\u00f3ry pozwala kontrolowa\u0107 up\u0142yw czasu oraz weryfikowa\u0107 oczekiwane wyniki test\u00f3w.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Testy integracyjne<\/h3>\n\n\n\n<p>Testuj\u0105 interakcje mi\u0119dzy r\u00f3\u017cnymi komponentami, operatorami lub funkcjami w systemie. Marble testing mo\u017ce by\u0107 r\u00f3wnie\u017c u\u017cywane w testach integracyjnych, aby zbada\u0107, jak r\u00f3\u017cne cz\u0119\u015bci kodu wsp\u00f3\u0142pracuj\u0105 ze sob\u0105. W testach integracyjnych sprawdzamy, czy przep\u0142yw danych mi\u0119dzy r\u00f3\u017cnymi komponentami jest zgodny z oczekiwaniami. Testowanie marble w kontek\u015bcie test\u00f3w integracyjnych jest bardziej z\u0142o\u017cone ni\u017c w przypadku test\u00f3w jednostkowych, ale mo\u017ce dostarczy\u0107 cenne informacje na temat zachowania systemu jako ca\u0142o\u015bci.&nbsp;<\/p>\n\n\n\n<p>W testowaniu z wykorzystaniem diagram\u00f3w marble&nbsp; istotne jest r\u00f3wnie\u017c zrozumienie operator\u00f3w \u201ehot\u201d i \u201ecold\u201d. W kontek\u015bcie strumieni danych operator \u201ehot\u201d to taki, kt\u00f3ry emituje warto\u015bci niezale\u017cnie od tego, czy istnieje obecnie jakakolwiek subskrypcja. Z kolei operator \u201ecold\u201d zaczyna emitowa\u0107 warto\u015bci dopiero po subskrypcji. W testach marble operator \u201ecold\u201d jest zazwyczaj reprezentowany przez strumienie oznaczone jako <strong>source<\/strong>. Najlepiej b\u0119dzie spojrze\u0107 na przyk\u0142ad:&nbsp;&nbsp;<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import { TestScheduler } from 'rxjs\/testing'; \n\nimport { of, Subject } from 'rxjs'; \n\nimport { map, takeUntil } from 'rxjs\/operators'; \n \n\nit('should demonstrate hot and cold observables', () => { \n\n  const testScheduler = new TestScheduler((actual, expected) => { \n\n    expect(actual).toEqual(expected); \n\n  }); \n\n \n\n  testScheduler.run(({ cold, hot, expectObservable }) => { \n\n    const sourceCold$ = cold(' --a--b--c--|'); \n\n    const sourceHot$ = hot('  --d--e--f--|'); \n\n    const stop$ = cold('      -----s--|'); \n\n    const expectedMarble = '  --x--y--(z|)'; \n\n \n\n    const resultCold$ = sourceCold$.pipe( \n\n      takeUntil(stop$), \n\n      map((value) => value.toUpperCase()) \n\n    ); \n\n    const resultHot$ = sourceHot$.pipe( \n\n      takeUntil(stop$), \n\n      map((value) => value.toUpperCase()) \n\n    ); \n\n    expectObservable(resultCold$).toBe(expectedMarble, { \n\n      x: 'A', \n\n      y: 'B', \n\n      z: 'C' \n\n    }); \n\n    expectObservable(resultHot$).toBe(expectedMarble, { \n\n      x: 'D', \n\n      y: 'E', \n\n      z: 'F' \n\n    }); \n\n  }); \n\n}); <\/pre>\n\n\n\n<p>W powy\u017cszym przyk\u0142adzie widzimy dwa strumienie danych: \u201ecold\u201d i \u201ehot&#8221;. Strumie\u0144 \u201ecold\u201d zaczyna emitowa\u0107 warto\u015bci tylko po subskrypcji, podczas gdy strumie\u0144 \u201ehot\u201d emituje warto\u015bci niezale\u017cnie od subskrypcji. W te\u015bcie u\u017cywamy operatora \u201e<strong>takeUntil<\/strong>\u201d do zako\u0144czenia obserwacji strumieni danych w odpowiednim momencie.&nbsp;<\/p>\n\n\n\n<p>Podsumowuj\u0105c, marble diagrams w RxJS s\u0105 niezwykle pomocne w zrozumieniu przep\u0142ywu danych oraz zachowa\u0144 poszczeg\u00f3lnych operator\u00f3w w strumieniach danych. Testowanie marble u\u0142atwia tworzenie test\u00f3w jednostkowych oraz integracyjnych, kt\u00f3re s\u0105 niezb\u0119dne dla poprawnego dzia\u0142ania aplikacji opartej na RxJS. Wiedza na temat diagram\u00f3w marble oraz umiej\u0119tno\u015b\u0107 pisania skutecznych test\u00f3w marble s\u0105 wa\u017cnymi kompetencjami ka\u017cdego programisty korzystaj\u0105cego z biblioteki RxJS.&nbsp;<\/p>\n\n\n\n<p>W przypadku pracy z marble warto pami\u0119ta\u0107 o kilku dodatkowych zasadach i wskaz\u00f3wkach, kt\u00f3re mog\u0105 u\u0142atwi\u0107 proces testowania:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Konwencje nazewnictwa:<\/strong> kiedy tworzysz strumienie danych za pomoc\u0105 diagram\u00f3w marble, warto utrzymywa\u0107 konwencje nazewnictwa i u\u017cywa\u0107 nazw zwi\u0105zanych z funkcjonalno\u015bci\u0105 strumieni. Dzi\u0119ki temu mo\u017cemy \u0142atwo zrozumie\u0107, jakie dane przep\u0142ywaj\u0105 przez strumienie, co u\u0142atwia analizowanie wynik\u00f3w test\u00f3w.&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Korzystanie z helper\u00f3w: <\/strong>w wielu przypadkach testowania marble mo\u017cemy skorzysta\u0107 z funkcji pomocniczych dostarczanych przez bibliotek\u0119 RxJS, takich jak <strong>TestScheduler<\/strong>,<strong> hot<\/strong>,<strong> cold<\/strong>,<strong> time<\/strong>,<strong> expectObservable <\/strong>i<strong> expectSubscriptions<\/strong>. Te funkcje u\u0142atwiaj\u0105 tworzenie diagram\u00f3w marble oraz zarz\u0105dzanie nimi i testowanie przep\u0142ywu danych mi\u0119dzy r\u00f3\u017cnymi strumieniami.&nbsp;<\/li>\n\n\n\n<li><strong>Weryfikacja wynik\u00f3w test\u00f3w:<\/strong> podczas pisania test\u00f3w marble warto zwraca\u0107 uwag\u0119 na wyniki test\u00f3w i b\u0142\u0119dy zg\u0142aszane przez narz\u0119dzia do testowania, takie jak Jasmine lub Mocha. Dzi\u0119ki temu mo\u017cemy szybko zidentyfikowa\u0107 i naprawi\u0107 b\u0142\u0119dy w naszym kodzie.&nbsp;<\/li>\n\n\n\n<li><strong>Dok\u0142adno\u015b\u0107 test\u00f3w:<\/strong> testowanie marble pozwala na precyzyjne \u015bledzenie sekwencji zdarze\u0144 w strumieniach danych. Jednak wa\u017cne jest, aby pami\u0119ta\u0107, \u017ce testowanie marble nie zast\u0119puje innych rodzaj\u00f3w testowania, takich jak testy jednostkowe czy integracyjne. Warto korzysta\u0107 z r\u00f3\u017cnych technik testowania w zale\u017cno\u015bci od kontekstu i potrzeb aplikacji.&nbsp;<\/li>\n\n\n\n<li><strong>Praktyka: <\/strong>testowanie marble mo\u017ce by\u0107 na pocz\u0105tku trudne do zrozumienia, ale z biegiem czasu i nabieranym do\u015bwiadczeniem staje si\u0119 coraz \u0142atwiejsze. Praca z r\u00f3\u017cnymi przyk\u0142adami i scenariuszami pomo\u017ce zrozumie\u0107, jak najlepiej wykorzysta\u0107 diagramy marble w testach RxJS.&nbsp;<\/li>\n<\/ul>\n\n\n\n<p>U\u017cywaj\u0105c marble w RxJS, mo\u017cna skutecznie testowa\u0107 strumienie danych oraz interakcje mi\u0119dzy operacjami. Diagramy marble u\u0142atwiaj\u0105 zrozumienie przep\u0142ywu danych oraz oczekiwanych wynik\u00f3w test\u00f3w, co prowadzi do budowania bardziej niezawodnych i wydajnych aplikacji. Praktyka i do\u015bwiadczenie s\u0105 kluczowe w opanowaniu testowania marble, ale korzy\u015bci p\u0142yn\u0105ce z jego zastosowania s\u0105 nieocenione dla ka\u017cdego programisty Front-End.<\/p>\n\n\n\n<p><strong>Przeczytaj tak\u017ce:<\/strong> <a href=\"https:\/\/nearshore-it.eu\/pl\/artykuly\/testy-regresji\/\" data-type=\"URL\" data-id=\"https:\/\/nearshore-it.eu\/pl\/artykuly\/testy-regresji\/\" target=\"_blank\" rel=\"noreferrer noopener\">Test regresji \u2013 strata czasu czy&nbsp;must have w&nbsp;projekcie?<\/a><\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"ci-z-testowania-RxJS?\">Jakie s\u0105 korzy\u015bci z testowania RxJS?<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Dzia\u0142anie kodu zgodne z oczekiwaniami<\/strong> \u2013 testowanie kodu RxJS jest niezwykle wa\u017cne, gdy\u017c pozwala na zwi\u0119kszenie pewno\u015bci, \u017ce kod dzia\u0142a zgodnie z oczekiwaniami. Dzi\u0119ki testom programi\u015bci mog\u0105 by\u0107 pewni, \u017ce ich aplikacje rzeczywi\u015bcie spe\u0142niaj\u0105 za\u0142o\u017cone wymagania biznesowe, co przek\u0142ada si\u0119 na mniejsze ryzyko wyst\u0105pienia b\u0142\u0119d\u00f3w czy niezgodno\u015bci.&nbsp;<\/li>\n\n\n\n<li><strong>Wykrywanie b\u0142\u0119d\u00f3w<\/strong> \u2013 jednocze\u015bnie testowanie u\u0142atwia wykrywanie b\u0142\u0119d\u00f3w, poniewa\u017c sprawdza indywidualne funkcje, operatory oraz interakcje mi\u0119dzy nimi. Dzi\u0119ki temu mo\u017cliwe jest szybsze zidentyfikowanie i naprawienie problem\u00f3w w kodzie. To wp\u0142ywa r\u00f3wnie\u017c na skr\u00f3cenie czasu debugowania, gdy\u017c testy pomagaj\u0105 programistom szybko zlokalizowa\u0107 \u017ar\u00f3d\u0142o b\u0142\u0119du.&nbsp;<\/li>\n\n\n\n<li><strong>\u0141atwiejsze wprowadzanie zmian<\/strong> \u2013 testy RxJS wspieraj\u0105 tak\u017ce wprowadzanie zmian w kodzie, gdy\u017c automatycznie sprawdzaj\u0105 funkcjonalno\u015b\u0107 po ka\u017cdej modyfikacji. Dzi\u0119ki temu programista mo\u017ce szybciej wykry\u0107 i naprawi\u0107 ewentualne problemy wynikaj\u0105ce z wprowadzonych zmian. Ponadto testy u\u0142atwiaj\u0105 refaktoryzacj\u0119, gdy\u017c programista mo\u017ce by\u0107 pewny, \u017ce jego zmiany nie wprowadz\u0105 regresji.&nbsp;<\/li>\n\n\n\n<li><strong>Dokumentacja kodu <\/strong>\u2013<strong> <\/strong>warto r\u00f3wnie\u017c zauwa\u017cy\u0107, \u017ce testy RxJS cz\u0119sto s\u0142u\u017c\u0105 jako dokumentacja dla kodu, dostarczaj\u0105c informacji o tym, jak korzysta\u0107 z poszczeg\u00f3lnych funkcji i jakie s\u0105 ich oczekiwane wyniki. Taka dokumentacja jest nieoceniona dla innych programist\u00f3w, kt\u00f3rzy chc\u0105 zrozumie\u0107 czyj\u015b kod i wiedzie\u0107, jak go u\u017cywa\u0107.&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Wi\u0119ksze zaufanie do oprogramowania<\/strong> \u2013 wreszcie testowanie zwi\u0119ksza zaufanie do kodu zar\u00f3wno w\u015br\u00f3d programist\u00f3w, jak i interesariuszy projektu. Wszyscy mog\u0105 by\u0107 pewni, \u017ce aplikacja rzeczywi\u015bcie dzia\u0142a poprawnie i spe\u0142nia wymagania. Testy s\u0105 kluczowe dla utrzymania wysokiej jako\u015bci aplikacji opartych na strumieniach danych i reaktywnym programowaniu.&nbsp;<\/li>\n\n\n\n<li><strong>Lepszy kod<\/strong> \u2013 w efekcie testowanie kodu RxJS przyczynia si\u0119 do lepszej jako\u015bci kodu, szybszego wykrywania i naprawiania b\u0142\u0119d\u00f3w, \u0142atwiejszego wprowadzania zmian oraz wzrostu zaufania do kodu. Jako ekspert od RxJS, zdecydowanie polecam stosowanie test\u00f3w we wszelkich projektach opartych na tej bibliotece.&nbsp;<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"FAQ\">FAQ<\/h2>\n\n\n<div id=\"rank-math-faq\" class=\"rank-math-block\">\n<div class=\"rank-math-list \">\n<div id=\"faq-question-1684867289692\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \">Czym cechuj\u0105 si\u0119 frameworki testowe RxJS i jak wybra\u0107 najlepszy?\u00a0<\/h3>\n<div class=\"rank-math-answer \">\n\n<p>Frameworki testowe RxJS to narz\u0119dzia s\u0142u\u017c\u0105ce do tworzenia, organizowania i wykonywania test\u00f3w dla kodu opartego na RxJS. Wyb\u00f3r najlepszego frameworka zale\u017cy od potrzeb projektu i preferencji zespo\u0142u. Przy wyborze frameworka testowego dla RxJS warto zwr\u00f3ci\u0107 uwag\u0119 na nast\u0119puj\u0105ce aspekty:\u00a0<br \/>\u00a0<br \/><strong>Obs\u0142uga Marble Testing:<\/strong> wa\u017cne jest, aby wybra\u0107 framework, kt\u00f3ry obs\u0142uguje testy marble, gdy\u017c s\u0105 one kluczowe w testowaniu reaktywnych strumieni danych.\u00a0<br \/><strong>Integracja z innymi narz\u0119dziami:<\/strong> sprawd\u017a, jak dobrze framework integruje si\u0119 z innymi narz\u0119dziami u\u017cywanymi w projekcie, takimi jak bundlery, \u015brodowiska CI\/CD czy lintery.\u00a0\u00a0<br \/><strong>\u0141atwo\u015b\u0107 u\u017cycia:<\/strong> framework testowy powinien by\u0107 \u0142atwy w konfiguracji i u\u017cyciu.\u00a0<br \/><strong>Popularno\u015b\u0107 i wsparcie spo\u0142eczno\u015bci:<\/strong> popularne frameworki testowe maj\u0105 wi\u0119ksze szanse na aktywny rozw\u00f3j i wsparcie spo\u0142eczno\u015bci.\u00a0<br \/><strong>Dokumentacja: <\/strong>dobra dokumentacja jest kluczowa dla szybkiego wprowadzenia frameworka testowego do projektu oraz dla zrozumienia jego mo\u017cliwo\u015bci.\u00a0<br \/><strong>Wydajno\u015b\u0107:<\/strong> wydajno\u015b\u0107 frameworka testowego wp\u0142ywa na czas wykonywania test\u00f3w.\u00a0<br \/><strong>Elastyczno\u015b\u0107 i mo\u017cliwo\u015bci rozszerzenia:<\/strong> wybrany framework powinien oferowa\u0107 elastyczno\u015b\u0107 w konfiguracji oraz mo\u017cliwo\u015b\u0107 rozszerzenia o dodatkowe narz\u0119dzia lub funkcje.\u00a0<br \/>Przyk\u0142ady popularnych framework\u00f3w testowych wspieraj\u0105cych RxJS to Jasmine, Jest i Mocha. Ka\u017cdy z nich oferuje r\u00f3\u017cne funkcje i zalety, dlatego warto dok\u0142adnie przeanalizowa\u0107 ich mo\u017cliwo\u015bci przed podj\u0119ciem decyzji o wyborze.\u00a0<\/p>\n\n<\/div>\n<\/div>\n<div id=\"faq-question-1684867306736\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \">Jak wdro\u017cy\u0107 testowanie RxJS?\u00a0<\/h3>\n<div class=\"rank-math-answer \">\n\n<p>Aby wdro\u017cy\u0107 testowanie RxJS w projekcie, na pocz\u0105tek nale\u017cy wybra\u0107 odpowiedni framework testowy, kt\u00f3ry wspiera testy marble, tak jak Jasmine, Jest lub Mocha. Wyb\u00f3r powinien zale\u017ce\u0107 od potrzeb projektu i preferencji zespo\u0142u. Nast\u0119pnie przyst\u0105p do instalacji i konfiguracji wybranego frameworka testowego, u\u017cywaj\u0105c mened\u017cera pakiet\u00f3w, takiego jak npm lub yarn, i post\u0119puj\u0105c zgodnie z instrukcjami dostarczanymi przez dokumentacj\u0119 frameworka.\u00a0<\/p>\n<p>Je\u015bli wybrany framework testowy nie obs\u0142uguje test\u00f3w marble bezpo\u015brednio, zainstaluj dodatkowe narz\u0119dzia, takie jak rxjs-marbles dla Mochy czy jest-marbles dla Jesta. Teraz mo\u017cesz zacz\u0105\u0107 pisanie test\u00f3w jednostkowych dla komponent\u00f3w, us\u0142ug, operator\u00f3w i strumieni opartych na RxJS. Wykorzystaj testy marble do reprezentowania i testowania reaktywnych strumieni danych. Upewnij si\u0119, \u017ce testujesz kluczowe scenariusze, zar\u00f3wno pozytywne, jak i negatywne, aby sprawdzi\u0107 poprawno\u015b\u0107 dzia\u0142ania kodu.\u00a0<br \/>Dobrze jest umie\u015bci\u0107 testy w dedykowanych plikach lub folderach, aby \u0142atwo mo\u017cna by\u0142o je znale\u017a\u0107 i zarz\u0105dza\u0107 nimi. Przyj\u0119tym standardem jest umieszczanie test\u00f3w w folderze <strong>__tests__<\/strong> lub w plikach z rozszerzeniem <strong>.spec.ts <\/strong>lub <strong>.test.ts.<\/strong> Aby uruchomi\u0107 testy, u\u017cyj narz\u0119dzi dostarczonych przez framework testowy, zar\u00f3wno lokalnie, jak i na serwerze CI\/CD. W zale\u017cno\u015bci od frameworka mo\u017cesz wykorzysta\u0107 polecenia CLI, takie jak <strong>npm test<\/strong>, <strong>yarn test<\/strong> czy <strong>ng test.<\/strong>\u00a0<\/p>\n<p>Monitoruj wyniki test\u00f3w, analizuj b\u0142\u0119dy i naprawiaj problemy w kodzie. U\u017cyj narz\u0119dzi do generowania raport\u00f3w i statystyk, aby oceni\u0107 jako\u015b\u0107 kodu oraz \u015bledzi\u0107 post\u0119p w testowaniu. W miar\u0119 jak projekt si\u0119 rozwija, aktualizuj i utrzymuj testy, pisz\u0105c nowe testy dla nowych funkcji oraz aktualizuj\u0105c istniej\u0105ce testy w przypadku zmian w kodzie. Dzi\u0119ki temu utrzymanie wysokiej jako\u015bci kodu b\u0119dzie znacznie \u0142atwiejsze\u00a0\u00a0<\/p>\n\n<\/div>\n<\/div>\n<div id=\"faq-question-1684867333157\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \">Jakie s\u0105 typowe b\u0142\u0119dy testowania RxJS?\u00a0<\/h3>\n<div class=\"rank-math-answer \">\n\n<p>Jednym z takich b\u0142\u0119d\u00f3w jest nieuwzgl\u0119dnienie zasady asynchroniczno\u015bci przy testowaniu. W przypadku testowania strumieni danych wa\u017cne jest, aby pami\u0119ta\u0107 o u\u017cyciu odpowiednich technik testowania asynchronicznego, takich jak testy marble, czy wykorzystywanie funkcji <strong>fakeAsync<\/strong> i <strong>tick<\/strong> dostarczanych przez Angulara.\u00a0<\/p>\n<p>Inny typowy b\u0142\u0105d polega na niew\u0142a\u015bciwym zarz\u0105dzaniu subskrypcjami. Je\u015bli subskrypcje nie zostan\u0105 anulowane po zako\u0144czeniu test\u00f3w, mo\u017ce to prowadzi\u0107 do wyciek\u00f3w pami\u0119ci i fa\u0142szywie pozytywnych wynik\u00f3w test\u00f3w. Warto zwr\u00f3ci\u0107 uwag\u0119 na to, aby odpowiednio zarz\u0105dza\u0107 subskrypcjami, zw\u0142aszcza w przypadku testowania komponent\u00f3w czy us\u0142ug. <\/p>\n<p>Cz\u0119stym b\u0142\u0119dem jest r\u00f3wnie\u017c niew\u0142a\u015bciwe u\u017cycie operator\u00f3w RxJS, kt\u00f3re mo\u017ce prowadzi\u0107 do nieoczekiwanych rezultat\u00f3w. Szczeg\u00f3lnie wa\u017cne jest zrozumienie r\u00f3\u017cnicy mi\u0119dzy operatorem <strong>switchMap<\/strong> a <strong>mergeMap <\/strong>oraz innymi operatorami, kt\u00f3re maj\u0105 wp\u0142yw na zachowanie strumieni danych.\u00a0<\/p>\n<p>Nieodpowiednie testowanie b\u0142\u0119d\u00f3w mo\u017ce prowadzi\u0107 do fa\u0142szywego poczucia bezpiecze\u0144stwa. Warto zwr\u00f3ci\u0107 uwag\u0119 na testowanie obs\u0142ugi b\u0142\u0119d\u00f3w, zw\u0142aszcza w przypadku asynchronicznych operacji, takich jak \u017c\u0105dania HTTP. W takich przypadkach warto u\u017cy\u0107 odpowiednich operator\u00f3w do obs\u0142ugi b\u0142\u0119d\u00f3w, takich jak <strong>catchError<\/strong> i <strong>retry<\/strong>.\u00a0<\/p>\n<p>Niedok\u0142adne testowanie warunk\u00f3w brzegowych i skrajnych scenariuszy mo\u017ce prowadzi\u0107 do niewykrycia problem\u00f3w. Dlatego warto d\u0105\u017cy\u0107 do pe\u0142nego pokrycia testami, a tak\u017ce bada\u0107 r\u00f3\u017cne kombinacje danych wej\u015bciowych, kt\u00f3re mog\u0105 wp\u0142yn\u0105\u0107 na dzia\u0142anie strumieni danych. Testowanie tych przypadk\u00f3w mo\u017ce ujawni\u0107 potencjalne problemy, kt\u00f3rych mo\u017cna nie zauwa\u017cy\u0107 podczas testowania tylko typowych scenariuszy.\u00a0<\/p>\n<p>Ostatnim b\u0142\u0119dem, ale nie mniej wa\u017cnym, jest niew\u0142a\u015bciwe stosowanie operator\u00f3w cold i hot podczas testowania marble. Warto zrozumie\u0107 r\u00f3\u017cnice mi\u0119dzy tymi operatorami oraz wiedzie\u0107, kiedy stosowa\u0107 jeden, a kiedy drugi, aby uzyska\u0107 wiarygodne wyniki test\u00f3w.\u00a0<\/p>\n\n<\/div>\n<\/div>\n<div id=\"faq-question-1684867388576\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \">Jakie s\u0105 wzorce projektowe testowania RxJS?\u00a0<\/h3>\n<div class=\"rank-math-answer \">\n\n<p>Wzorce projektowe testowania RxJS to sprawdzone techniki stosowane w testowaniu aplikacji opartych na tej bibliotece. Kluczowym elementem jest wdro\u017cenie test\u00f3w marble, kt\u00f3re umo\u017cliwiaj\u0105 wizualizacj\u0119 i testowanie strumieni danych, a tak\u017ce analiz\u0119 interakcji mi\u0119dzy nimi. Dzi\u0119ki stosowaniu takich wzorc\u00f3w testy asynchroniczne stan\u0105 si\u0119 bardziej efektywne, a izolacja testowanych cz\u0119\u015bci aplikacji od zewn\u0119trznych zale\u017cno\u015bci pozwoli na kontrolowanie zachowa\u0144 i przetestowanie r\u00f3\u017cnych scenariuszy.\u00a0<\/p>\n\n<\/div>\n<\/div>\n<div id=\"faq-question-1684867400504\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \">Jakie s\u0105 najlepsze praktyki testowania?\u00a0<\/h3>\n<div class=\"rank-math-answer \">\n\n<p>W odniesieniu do najlepszych praktyk testowania w kontek\u015bcie biblioteki RxJS warto skupi\u0107 si\u0119 na podej\u015bciach i technikach, kt\u00f3re czyni\u0105 testy efektywnymi, wydajnymi i \u0142atwymi w utrzymaniu. Testowanie asynchroniczne, w tym <strong>async<\/strong>, <strong>fakeAsync<\/strong> czy <strong>testy marble<\/strong>, pozwala na przetestowanie r\u00f3\u017cnych scenariuszy zwi\u0105zanych z asynchronicznymi operacjami. Kluczowe jest r\u00f3wnie\u017c testowanie obs\u0142ugi b\u0142\u0119d\u00f3w, aby sprawdzi\u0107, czy s\u0105 one prawid\u0142owo obs\u0142ugiwane w strumieniach danych. Wa\u017cne jest, aby testowa\u0107 warunki brzegowe i skrajne scenariusze, co pozwala na wykrycie potencjalnych problem\u00f3w, kt\u00f3re mog\u0105 umkn\u0105\u0107 podczas testowania tylko typowych scenariuszy. Monitorowanie poziomu pokrycia testami oraz dbanie o dobr\u0105 organizacj\u0119 test\u00f3w, umieszczanie ich w dedykowanych plikach lub folderach, u\u0142atwia zarz\u0105dzanie kodem i utrzymanie jego przejrzysto\u015bci.\u00a0<\/p>\n\n<\/div>\n<\/div>\n<\/div>\n<\/div>","protected":false},"excerpt":{"rendered":"<p>W tym artykule przyjrzymy si\u0119 RxJS Marble testing \u2013 niezb\u0119dnemu narz\u0119dziu dla testowania biblioteki RxJS. Zbadamy zasady testowania observable (ang. observables), jak r\u00f3wnie\u017c technik\u0119 marble testing, kt\u00f3ra u\u0142atwia tworzenie i analizowanie test\u00f3w. Przeanalizujemy r\u00f3wnie\u017c korzy\u015bci p\u0142yn\u0105ce z tego podej\u015bcia oraz om\u00f3wimy najlepsze praktyki zwi\u0105zane z testowaniem kodu RxJS.<\/p>\n","protected":false},"author":110,"featured_media":30592,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"iawp_total_views":96,"footnotes":""},"categories":[1,582],"tags":[614,570],"offering":[522],"class_list":["post-30591","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-artykuly","category-technologie","tag-application-development","tag-javascript-pl","offering-tech-blog"],"acf":[],"_links":{"self":[{"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/posts\/30591","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/users\/110"}],"replies":[{"embeddable":true,"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/comments?post=30591"}],"version-history":[{"count":4,"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/posts\/30591\/revisions"}],"predecessor-version":[{"id":33867,"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/posts\/30591\/revisions\/33867"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/media\/30592"}],"wp:attachment":[{"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/media?parent=30591"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/categories?post=30591"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/tags?post=30591"},{"taxonomy":"offering","embeddable":true,"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/offering?post=30591"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}