{"id":31661,"date":"2020-12-23T00:00:00","date_gmt":"2020-12-22T23:00:00","guid":{"rendered":"https:\/\/blexin.com\/?p=31661"},"modified":"2021-01-13T09:39:53","modified_gmt":"2021-01-13T08:39:53","slug":"angular-testing-non-mi-fai-paura","status":"publish","type":"post","link":"https:\/\/blexin.com\/it\/blog\/angular-testing-non-mi-fai-paura\/","title":{"rendered":"Angular Testing non mi fai paura"},"content":{"rendered":"\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"608\" data-attachment-id=\"31662\" data-permalink=\"https:\/\/blexin.com\/it\/blog\/angular-testing-non-mi-fai-paura\/attachment\/1105x656_w_blog-angulartesting-2\/\" data-orig-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2021\/01\/1105x656_w_blog-angulartesting.png?fit=1105%2C656&amp;ssl=1\" data-orig-size=\"1105,656\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"1105x656_w_blog-angulartesting\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2021\/01\/1105x656_w_blog-angulartesting.png?fit=1024%2C608&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2021\/01\/1105x656_w_blog-angulartesting.png?resize=1024%2C608&#038;ssl=1\" alt=\"\" class=\"wp-image-31662\" srcset=\"https:\/\/blexin.com\/wp-content\/uploads\/2021\/01\/1105x656_w_blog-angulartesting-1024x608.png 1024w, https:\/\/blexin.com\/wp-content\/uploads\/2021\/01\/1105x656_w_blog-angulartesting-980x582.png 980w, https:\/\/blexin.com\/wp-content\/uploads\/2021\/01\/1105x656_w_blog-angulartesting-480x285.png 480w\" sizes=\"auto, (min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">La prima volta che ho aperto un file di test, di quelli che troviamo dopo aver creato un nuovo progetto mediante la CLI Angular, mi sono un po\u2019 perso.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Avendo molta pi\u00f9 familiarit\u00e0 con framework di test come XUnit o NUnit, ho cercato di fare il match tra quelle che sono le parti di un file di test in NUnit e quelle presenti in un file di test di Jasmine.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Di seguito, vediamo il codice del file app.component.spec.ts con l\u2019obiettivo di analizzarlo, cos\u00ec da poter iniziare a creare i nostri file di test.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\nimport { TestBed, async } from &#039;@angular\/core\/testing&#039;;\nimport { RouterTestingModule } from &#039;@angular\/router\/testing&#039;;\nimport { AppComponent } from &#039;.\/app.component&#039;;\n \ndescribe(&#039;AppComponent&#039;, () =&gt; {\n  beforeEach(async(() =&gt; {\n    TestBed.configureTestingModule({\n      imports: &#x5B;\n        RouterTestingModule\n      ],\n      declarations: &#x5B;\n        AppComponent\n      ],\n    }).compileComponents();\n  }));\n \n  it(&#039;should create the app&#039;, () =&gt; {\n    const fixture = TestBed.createComponent(AppComponent);\n    const app = fixture.debugElement.componentInstance;\n    expect(app).toBeTruthy();\n  });\n \n  it(`should have as title &#039;AngularTesting&#039;`, () =&gt; {\n    const fixture = TestBed.createComponent(AppComponent);\n    const app = fixture.debugElement.componentInstance;\n    expect(app.title).toEqual(&#039;AngularTesting&#039;);\n  });\n \n  it(&#039;should render title in a h1 tag&#039;, () =&gt; {\n    const fixture = TestBed.createComponent(AppComponent);\n    fixture.detectChanges();\n    const compiled = fixture.debugElement.nativeElement;\n    expect(compiled.querySelector(&#039;h1&#039;).textContent).toContain(&#039;Welcome to AngularTesting!&#039;);\n  });\n});\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Come primo passaggio ho cercato qualcosa del tipo<strong>&nbsp;<em>[TestFixture]&nbsp;<\/em><\/strong>che mi identifichi che \u00e8 una classe di test.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Nel codice troviamo&nbsp;<strong>describe<\/strong>(\u2018AppComponent\u2019 () =&gt; {});che rappresenta il nostro<strong><em>&nbsp;[TestFixture]<\/em><\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Subito dopo c\u2019\u00e8&nbsp;<strong>beforeEach<\/strong>(() =&gt; {}); che in NUnit viene identificato con l\u2019annotazione<strong><em>&nbsp;[SetUp]<\/em><\/strong>, con la quale stiamo istruendo NUnit ad eseguire prima di ogni test il metodo decorato, molto utile quando i test necessitano di una fase di setup comune. Allo stesso modo, le istruzioni contenute nel blocco beforeEach verranno eseguite prima di ogni test.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A questo punto ci manca&nbsp;<strong><em>[Test]<\/em><\/strong>&nbsp;che troviamo in genere sui metodi, ma in questo caso direi che \u00e8 abbastanza semplice individuarlo, anche per come \u00e8 formato il file.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>it<\/strong>(&#8216;should create the app&#8217;, () =&gt; {});<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ora che siamo riusciti a dividere il file di test possiamo analizzare le aree in modo pi\u00f9 specifico.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Angular TestBed<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">In beforeEach troviamo la seguente istruzione:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>TestBed.configureTestingModule({});<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Innanzitutto, occorre capire chi \u00e8&nbsp;<strong>TestBed<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Angular Test Bed (ATB)&nbsp;<\/strong>\u00e8 il framework di testing Angular a pi\u00f9 alto livello che ci permette di testare tutto ci\u00f2 che dipende dal Framework Angular stesso.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Tornando all\u2019istruzione, ecco una delle cose che ci permette di fare TestBed: creare dinamicamente un modulo per il nostro test che simula un NgModule di Angular. La struttura \u00e8 praticamente la stessa, con le import, le declarations e tutto quello che possiamo dichiarare in un NgModule.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Analizzando uno dei test, ad esempio:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\nit(&#039;should create the app&#039;, () =&gt; {\n    const fixture = TestBed.createComponent(AppComponent);\n    const app = fixture.debugElement.componentInstance;\n    expect(app).toBeTruthy();\n  });\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">incontriamo un\u2019altra istruzione in cui \u00e8 presente ATB,<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong><em>TestBed.createComponent(AppComponent);<\/em><\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La prima cosa che mi sono chiesto guardando questa istruzione \u00e8 stata perch\u00e9 non \u00e8 stato utilizzata una semplice&nbsp;<strong><em>new<\/em><\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Un component non \u00e8 solo una classe, con la new ottengo solo l\u2019istanza della classe del component. Certo, posso ancora testare il suo funzionamento, ma non posso testare se gli elementi della DOM vengono correttamente creati e se interagiscono come mi aspetto.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Va quindi utilizzato il&nbsp;<strong>createComponent<\/strong>&nbsp;del ATB che crea un\u2019istanza di AppComponent, alla quale \u00e8 associato il template HTML e ritorna un oggetto di tipo&nbsp;<strong>ComponentFixture.<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">ComponentFixture<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Un&nbsp;<strong>ComponentFixture<\/strong>&nbsp;\u00e8 uno strumento che ci permette di debuggare e testare un componente.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nit(&#039;should create the app&#039;, () =&gt; {\n    const fixture = TestBed.createComponent(AppComponent);\n    const app = fixture.debugElement.componentInstance;\n    expect(app).toBeTruthy();\n  });\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Possiamo intuire cosa stia testando questo metodo: si assicura che sia stata creata correttamente l\u2019istanza di AppComponent.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Cos\u2019\u00e8 invece&nbsp;<strong>debugElement&nbsp;<\/strong>non \u00e8 cos\u00ec immediato e va quindi analizzato.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Come abbiamo detto un component non \u00e8 solo una classe ma \u00e8 anche il suo template. ComponentFixture racchiude queste due cose in un unico oggetto, ed espone alcune propriet\u00e0 come&nbsp;<strong>debugElement<\/strong>&nbsp;e&nbsp;<strong>nativeElement<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In nativeElement, Angular non \u00e8 in grado di sapere a tempo di compilazione cosa andremo a trovare, dipende dall\u2019ambiente di test che stiamo utilizzando.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Nel caso sia un ambiente browser, come quello che vedremo in questi test, ci sar\u00e0 un HTMLElement e l\u2019oggetto sar\u00e0 lo stesso che troveremo in&nbsp;<strong>debugElement.nativeElement<\/strong>. Altrimenti, potrebbe esserci un oggetto che avr\u00e0 delle API ridotte rispetto ad HTMLElement o non averne affatto.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Angular quindi si affida all\u2019astrazione di&nbsp;<strong>debugElement<\/strong>&nbsp;per restare safe su ogni piattaforma supportata.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A partire dal HTMLElement possiamo utilizzare il querySelector per prendere gli elementi del DOM che ci interessa testare come accade nella seguente istruzione dell\u2019ultimo test:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\nconst compiled = fixture.debugElement.nativeElement;\nexpect(compiled.querySelector(&#039;h1&#039;).textContent).toContain(&#039;Welcome to AngularTesting!&#039;);\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Spy e TestBed.inject<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A questo punto, siamo quasi pronti per scrivere una nostra classe di test, ma ancora non abbiamo modo di testare componenti o servizi che hanno dipendenze.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ci sono diversi modi per poter fornire alla classe che stiamo testando le sue dipendenze.<br>Possiamo, ad esempio, passarle con una new, possiamo creare una classe Test Double, oppure, ed \u00e8 la scelta consigliata, utilizzare uno&nbsp;<strong>spy<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Jasmine ci permette di creare uno spy mediante la seguente istruzione:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\nvar fooSpy = jasmine.createSpyObj(foo, &#x5B;bar]);\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">e, con l\u2019istruzione seguente, possiamo fare il setup del metodo bar:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\nfooSpy.bar.and.returnValue(&#039;stub value&#039;);\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">ora non ci resta che creare la nostra classe passando lo spy<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\nservice = new Service(fooSpy);\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Con questa tecnica, per\u00f2, non stiamo utilizzando la dependency injection di Angular: nelle nostre applicazioni Angular non ci sogneremo mai di fare una&nbsp;<strong>new<\/strong>&nbsp;di una classe per passarla al nostro service. Generalmente, infatti, un approccio di questo tipo comporterebbe avere delle dipendenze che non facilitano il testing e richiederebbero la creazione manuale dell\u2019istanza. Per superare il problema, registriamo nel modulo opportuno tutte le classi che ci servono nell\u2019array Provider.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Vorremmo replicare lo stesso comportamento anche nei nostri test. Possiamo farlo combinando spy e ATB:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\nvar fooSpy = jasmine.createSpyObj(Foo, &#x5B;bar]);\nTestBed.configureTestingModule({\n    \u2026\n        providers: &#x5B;\n     Service,\n      { provide: Foo, useValue: fooSpy }\n    ]\n    ..\n});\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Infine, nei metodi di test utilizzeremo le seguenti istruzioni per recuperare le istanze che ci servono<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nservice = TestBed.inject(Service);\nfooSpy = TestBed.inject(Foo) as jasmine.SpyObj&amp;lt;Foo&gt;;\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\"><strong>TestBed.inject<\/strong>&nbsp;\u00e8 possibile utilizzarlo dalla versione 9 di Angular, per quelle precedenti va utilizzato&nbsp;<strong>TestBed.get.<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Demo<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Non ci resta che passare al codice e provare ad aggiungere una dipendenza all&#8217;AppComponent creato dalla CLI, e testare il tutto mediante uno spy.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Voglio creare un service che espone un metodo che restituisce una lista di stringhe: se la chiamata va a buon fine verr\u00e0 mostrata la lista, altrimenti un messaggio di errore.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Vediamo come possiamo configurare il test. Innanzitutto creiamo il service:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\nimport { Injectable } from &#039;@angular\/core&#039;;\nimport { Observable, of } from &#039;rxjs&#039;;\n@Injectable({ providedIn: &#039;root&#039; })\nexport class AppService {\n  constructor() { }\n  getList(): Observable&lt;string&#x5B;]&gt; {\n    return of(&#x5B;&#039;item1&#039;, &#039;item2&#039;, &#039;item3&#039;]);\n  }\n}\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Aggiungiamolo ad&nbsp;<strong><em>app.module.ts<\/em><\/strong>&nbsp;inserendolo tra i provider<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\n@NgModule({\n  declarations: &#x5B;\n    AppComponent\n  ],\n  imports: &#x5B;\n    BrowserModule,\n    AppRoutingModule\n  ],\n  providers: &#x5B;AppService],\n  bootstrap: &#x5B;AppComponent]\n})\nexport class AppModule { }\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">modifichiamo&nbsp;<strong><em>app.component.ts<\/em><\/strong>&nbsp;per poter fare la chiamata a getList()<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nimport { Component, OnInit } from &#039;@angular\/core&#039;;\nimport { AppService } from &#039;.\/app.service&#039;;\n \n@Component({\n  selector: &#039;app-root&#039;,\n  templateUrl: &#039;.\/app.component.html&#039;,\n  styleUrls: &#x5B;&#039;.\/app.component.css&#039;]\n})\nexport class AppComponent {\n  title = &#039;AngularTesting&#039;;\n  items = &#x5B;];\n  constructor(service: AppService) {\n    service.getList().subscribe(\n      data =&gt; this.items = data\n    );\n  }\n}\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">e&nbsp;<strong><em>app.component.html<\/em><\/strong>&nbsp;per visualizzare la lista.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: xml; title: ; notranslate\" title=\"\">\n&lt;div style=&quot;text-align:center&quot;&gt;\n  &lt;h1&gt;\n    Welcome to {{ title }}!\n  &lt;\/h1&gt;\n&lt;\/div&gt;\n&lt;ul&gt;\n  &lt;li *ngFor=&quot;let item of items&quot;&gt;{{item}}&lt;\/li&gt;\n&lt;\/ul&gt;\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Ora possiamo passare ad aggiungere i nostri test, modificando la classe di test che abbiamo analizzato prima&nbsp;<strong><em>app.component.spec.ts<\/em><\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Eseguendo ora i test presenti, saranno tutti rossi. Nell\u2019AppComponent abbiamo aggiunto una dipendenza con un metodo che ritorna un observable, quindi dobbiamo istruire la classe di test affinch\u00e9 gestisca la modifica.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Modifichiamo il&nbsp;<strong>beforeEach&nbsp;<\/strong>aggiungendo lo&nbsp;<strong>spy&nbsp;<\/strong>per il servizio creato, e procediamo con il setup del metodo getList<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\nconst items = &#x5B;&#039;item1&#039;, &#039;item2&#039;, &#039;item3&#039;];\nbeforeEach(async(() =&gt; {\n    const spy = jasmine.createSpyObj(&#039;AppService&#039;, &#x5B;&#039;getList&#039;]);\n    spy.getList.and.returnValue(of(items));\n \n    TestBed.configureTestingModule({\n      imports: &#x5B;\n        RouterTestingModule\n      ],\n      declarations: &#x5B;\n        AppComponent\n      ],\n      providers: &#x5B;\n        { provide: AppService, useValue: spy }\n      ]\n    }).compileComponents();\n  }));\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Con i test di nuovo verdi, possiamo inserirne uno nuovo.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nit(&#039;should render list when getList() work properly&#039;, () =&gt; {\n  const fixture = TestBed.createComponent(AppComponent);\n \n  fixture.detectChanges();\n  const compiled = fixture.debugElement.nativeElement;\n  const elements = compiled.querySelector(&#039;ul&#039;)\n  .querySelectorAll(&#039;li&#039;);\n \n  items.forEach((item, index) =&gt; {\n    expect(elements&#x5B;index].textContent === item);\n  });\n});\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Con questo test ci assicuriamo che gli elementi della lista mostrati all\u2019utente, nel caso in cui getList vada a buon fine, siano esattamente quelli che abbiamo fornito nel setup.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Manca il test in cui la chiamata genera un errore, e vogliamo mostrare all\u2019utente un messaggio di errore.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Nel componente, al momento non abbiamo nulla che gestisca tale errore lato codice n\u00e9 elementi in grado di visualizzarlo, dovremo quindi modificarlo per poter gestire questa casistica.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Proviamo, per\u00f2, a partire con un approccio TDD, partendo quindi dal test, e poi modifichiamo il componente.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Come primo passo andiamo a recuperare lo spy di AppService e cambiamo il comportamento del metodo getList, restituendo un errore.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ora possiamo creare il nostro expect: mediante querySelector recuperiamo l\u2019elemento html che dovrebbe contenere il messaggio di errore e verifichiamo che contenga esattamente \u201cError!\u201d.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Il test completo dovrebbe essere cos\u00ec<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nit(&#039;should show error message when getList() return an error&#039;, () =&gt; {\n   const errorMessage = &#039;Fake error&#039;;\n   const spy = TestBed.get(AppService) as jasmine.SpyObj&amp;lt;AppService&gt;;\n   spy.getList.and.callFake(() =&gt; {\n     return throwError(new Error(errorMessage));\n   });\n   const fixture = TestBed.createComponent(AppComponent);\n \n   fixture.detectChanges();\n   const compiled = fixture.debugElement.nativeElement;\n   const element = compiled.querySelector(&#039;h2.error&#039;);\n \n   expect(element.textContent.trim()).toEqual(errorMessage);\n });\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Lanciando i test, avremo un test rosso, e la motivazione \u00e8 che non pu\u00f2 essere letta la propriet\u00e0 textContent di un oggetto nullo. In parole povere, non \u00e8 stato trovato nessun elemento h2 con classe error nel componente. Mi sarei sorpreso del contrario.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"714\" data-attachment-id=\"31683\" data-permalink=\"https:\/\/blexin.com\/it\/blog\/angular-testing-non-mi-fai-paura\/attachment\/image01-14\/\" data-orig-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2021\/01\/image01.png?fit=2264%2C1578&amp;ssl=1\" data-orig-size=\"2264,1578\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"image01\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2021\/01\/image01.png?fit=1024%2C714&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2021\/01\/image01.png?resize=1024%2C714&#038;ssl=1\" alt=\"\" class=\"wp-image-31683\" srcset=\"https:\/\/blexin.com\/wp-content\/uploads\/2021\/01\/image01-980x683.png 980w, https:\/\/blexin.com\/wp-content\/uploads\/2021\/01\/image01-480x335.png 480w\" sizes=\"auto, (min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Andiamo a modificare ora il componente per catturare l\u2019errore lanciato da getList:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\napp.component.ts\nimport { Component } from &#039;@angular\/core&#039;;\nimport { AppService } from &#039;.\/app.service&#039;;\n \n@Component({\n  selector: &#039;app-root&#039;,\n  templateUrl: &#039;.\/app.component.html&#039;,\n  styleUrls: &#x5B;&#039;.\/app.component.css&#039;]\n})\nexport class AppComponent {\n  title = &#039;AngularTesting&#039;;\n  items = &#x5B;];\n  errorMessage = &#039;&#039;;\n \n  constructor(service: AppService) {\n    this.errorMessage = &#039;&#039;;\n \n    service.getList().subscribe(\n      data =&gt; this.items = data,\n      error =&gt; this.errorMessage = error.message\n    );\n  }\n}\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">e mostriamolo mediante tag h2 con classe error come stabilito nel test:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: xml; title: ; notranslate\" title=\"\">\napp.component.html\n&lt;h1&gt;\n    Welcome to {{ title }}!\n  &lt;\/h1&gt;\n&lt;\/div&gt;\n&lt;h2 class=&quot;error&quot; *ngIf=&quot;errorMessage&quot;&gt;\n  {{errorMessage}}\n&lt;\/h2&gt;\n&lt;ul&gt;\n  &lt;li *ngFor=&quot;let item of items&quot;&gt;{{item}}&lt;\/li&gt;\n&lt;\/ul&gt;\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Infine rilanciamo i test:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"714\" data-attachment-id=\"31686\" data-permalink=\"https:\/\/blexin.com\/it\/blog\/angular-testing-non-mi-fai-paura\/attachment\/image02-13\/\" data-orig-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2021\/01\/image02.png?fit=2264%2C1578&amp;ssl=1\" data-orig-size=\"2264,1578\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"image02\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2021\/01\/image02.png?fit=1024%2C714&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2021\/01\/image02.png?resize=1024%2C714&#038;ssl=1\" alt=\"\" class=\"wp-image-31686\" srcset=\"https:\/\/blexin.com\/wp-content\/uploads\/2021\/01\/image02-980x683.png 980w, https:\/\/blexin.com\/wp-content\/uploads\/2021\/01\/image02-480x335.png 480w\" sizes=\"auto, (min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">In un solo articolo non \u00e8 stato possibile affrontare tutti gli scenari che si presentano nei test. Ma questa pu\u00f2 essere di sicuro una buona base per poter iniziare a comprendere i test esistenti in un progetto Angular e per poter iniziare a scrivere i nostri test che coprono le richieste delle attivit\u00e0 che ci hanno assegnato.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Spero che l\u2019articolo vi sia piaciuto.<br>Al prossimo!<\/p>\n\n\n\n\n","protected":false},"excerpt":{"rendered":"<p>Uno sguardo al testing partendo dai file .spec.ts e creazione dei nostri primi test<\/p>\n","protected":false},"author":196716250,"featured_media":31662,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_et_pb_use_builder":"off","_et_pb_old_content":"","_et_gb_content_width":"","_coblocks_attr":"","_coblocks_dimensions":"","_coblocks_responsive_height":"","_coblocks_accordion_ie_support":"","_crdt_document":"","inline_featured_image":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"_wpas_customize_per_network":false,"jetpack_post_was_ever_published":false},"categories":[688637374],"tags":[688637387,688637409],"class_list":["post-31661","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blog","tag-angular","tag-testing"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Angular Testing non mi fai paura - Blexin<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/blexin.com\/it\/blog\/angular-testing-non-mi-fai-paura\/\" \/>\n<meta property=\"og:locale\" content=\"it_IT\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Angular Testing non mi fai paura - Blexin\" \/>\n<meta property=\"og:description\" content=\"Uno sguardo al testing partendo dai file .spec.ts e creazione dei nostri primi test\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blexin.com\/it\/blog\/angular-testing-non-mi-fai-paura\/\" \/>\n<meta property=\"og:site_name\" content=\"Blexin\" \/>\n<meta property=\"article:published_time\" content=\"2020-12-22T23:00:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2021-01-13T08:39:53+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/i1.wp.com\/blexin.com\/wp-content\/uploads\/2021\/01\/1105x656_w_blog-angulartesting.png?fit=1105%2C656&ssl=1\" \/>\n\t<meta property=\"og:image:width\" content=\"1105\" \/>\n\t<meta property=\"og:image:height\" content=\"656\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Adolfo Arnold\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Scritto da\" \/>\n\t<meta name=\"twitter:data1\" content=\"Adolfo Arnold\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tempo di lettura stimato\" \/>\n\t<meta name=\"twitter:data2\" content=\"9 minuti\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/angular-testing-non-mi-fai-paura\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/angular-testing-non-mi-fai-paura\\\/\"},\"author\":{\"name\":\"Adolfo Arnold\",\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/#\\\/schema\\\/person\\\/0de430b61c8a48b0e9d81308817c1517\"},\"headline\":\"Angular Testing non mi fai paura\",\"datePublished\":\"2020-12-22T23:00:00+00:00\",\"dateModified\":\"2021-01-13T08:39:53+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/angular-testing-non-mi-fai-paura\\\/\"},\"wordCount\":1324,\"image\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/angular-testing-non-mi-fai-paura\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/i0.wp.com\\\/blexin.com\\\/wp-content\\\/uploads\\\/2021\\\/01\\\/1105x656_w_blog-angulartesting.png?fit=1105%2C656&ssl=1\",\"keywords\":[\"Angular\",\"Testing\"],\"articleSection\":[\"Blog\"],\"inLanguage\":\"it-IT\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/angular-testing-non-mi-fai-paura\\\/\",\"url\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/angular-testing-non-mi-fai-paura\\\/\",\"name\":\"Angular Testing non mi fai paura - Blexin\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/angular-testing-non-mi-fai-paura\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/angular-testing-non-mi-fai-paura\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/i0.wp.com\\\/blexin.com\\\/wp-content\\\/uploads\\\/2021\\\/01\\\/1105x656_w_blog-angulartesting.png?fit=1105%2C656&ssl=1\",\"datePublished\":\"2020-12-22T23:00:00+00:00\",\"dateModified\":\"2021-01-13T08:39:53+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/#\\\/schema\\\/person\\\/0de430b61c8a48b0e9d81308817c1517\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/angular-testing-non-mi-fai-paura\\\/#breadcrumb\"},\"inLanguage\":\"it-IT\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/angular-testing-non-mi-fai-paura\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/angular-testing-non-mi-fai-paura\\\/#primaryimage\",\"url\":\"https:\\\/\\\/i0.wp.com\\\/blexin.com\\\/wp-content\\\/uploads\\\/2021\\\/01\\\/1105x656_w_blog-angulartesting.png?fit=1105%2C656&ssl=1\",\"contentUrl\":\"https:\\\/\\\/i0.wp.com\\\/blexin.com\\\/wp-content\\\/uploads\\\/2021\\\/01\\\/1105x656_w_blog-angulartesting.png?fit=1105%2C656&ssl=1\",\"width\":1105,\"height\":656},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/angular-testing-non-mi-fai-paura\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/blexin.com\\\/it\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Angular Testing non mi fai paura\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/#website\",\"url\":\"https:\\\/\\\/blexin.com\\\/it\\\/\",\"name\":\"Blexin\",\"description\":\"Con noi \u00e8 semplice\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/blexin.com\\\/it\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"it-IT\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/#\\\/schema\\\/person\\\/0de430b61c8a48b0e9d81308817c1517\",\"name\":\"Adolfo Arnold\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/ff2a87b54d0f130d7452164533199af05ef16dbd08b9241729946cea0eec7cca?s=96&d=identicon&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/ff2a87b54d0f130d7452164533199af05ef16dbd08b9241729946cea0eec7cca?s=96&d=identicon&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/ff2a87b54d0f130d7452164533199af05ef16dbd08b9241729946cea0eec7cca?s=96&d=identicon&r=g\",\"caption\":\"Adolfo Arnold\"},\"url\":\"https:\\\/\\\/blexin.com\\\/it\\\/author\\\/adolfo-arnoldblexin-com\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Angular Testing non mi fai paura - Blexin","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/blexin.com\/it\/blog\/angular-testing-non-mi-fai-paura\/","og_locale":"it_IT","og_type":"article","og_title":"Angular Testing non mi fai paura - Blexin","og_description":"Uno sguardo al testing partendo dai file .spec.ts e creazione dei nostri primi test","og_url":"https:\/\/blexin.com\/it\/blog\/angular-testing-non-mi-fai-paura\/","og_site_name":"Blexin","article_published_time":"2020-12-22T23:00:00+00:00","article_modified_time":"2021-01-13T08:39:53+00:00","og_image":[{"width":1105,"height":656,"url":"https:\/\/i1.wp.com\/blexin.com\/wp-content\/uploads\/2021\/01\/1105x656_w_blog-angulartesting.png?fit=1105%2C656&ssl=1","type":"image\/png"}],"author":"Adolfo Arnold","twitter_card":"summary_large_image","twitter_misc":{"Scritto da":"Adolfo Arnold","Tempo di lettura stimato":"9 minuti"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/blexin.com\/it\/blog\/angular-testing-non-mi-fai-paura\/#article","isPartOf":{"@id":"https:\/\/blexin.com\/it\/blog\/angular-testing-non-mi-fai-paura\/"},"author":{"name":"Adolfo Arnold","@id":"https:\/\/blexin.com\/it\/#\/schema\/person\/0de430b61c8a48b0e9d81308817c1517"},"headline":"Angular Testing non mi fai paura","datePublished":"2020-12-22T23:00:00+00:00","dateModified":"2021-01-13T08:39:53+00:00","mainEntityOfPage":{"@id":"https:\/\/blexin.com\/it\/blog\/angular-testing-non-mi-fai-paura\/"},"wordCount":1324,"image":{"@id":"https:\/\/blexin.com\/it\/blog\/angular-testing-non-mi-fai-paura\/#primaryimage"},"thumbnailUrl":"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2021\/01\/1105x656_w_blog-angulartesting.png?fit=1105%2C656&ssl=1","keywords":["Angular","Testing"],"articleSection":["Blog"],"inLanguage":"it-IT"},{"@type":"WebPage","@id":"https:\/\/blexin.com\/it\/blog\/angular-testing-non-mi-fai-paura\/","url":"https:\/\/blexin.com\/it\/blog\/angular-testing-non-mi-fai-paura\/","name":"Angular Testing non mi fai paura - Blexin","isPartOf":{"@id":"https:\/\/blexin.com\/it\/#website"},"primaryImageOfPage":{"@id":"https:\/\/blexin.com\/it\/blog\/angular-testing-non-mi-fai-paura\/#primaryimage"},"image":{"@id":"https:\/\/blexin.com\/it\/blog\/angular-testing-non-mi-fai-paura\/#primaryimage"},"thumbnailUrl":"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2021\/01\/1105x656_w_blog-angulartesting.png?fit=1105%2C656&ssl=1","datePublished":"2020-12-22T23:00:00+00:00","dateModified":"2021-01-13T08:39:53+00:00","author":{"@id":"https:\/\/blexin.com\/it\/#\/schema\/person\/0de430b61c8a48b0e9d81308817c1517"},"breadcrumb":{"@id":"https:\/\/blexin.com\/it\/blog\/angular-testing-non-mi-fai-paura\/#breadcrumb"},"inLanguage":"it-IT","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blexin.com\/it\/blog\/angular-testing-non-mi-fai-paura\/"]}]},{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/blexin.com\/it\/blog\/angular-testing-non-mi-fai-paura\/#primaryimage","url":"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2021\/01\/1105x656_w_blog-angulartesting.png?fit=1105%2C656&ssl=1","contentUrl":"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2021\/01\/1105x656_w_blog-angulartesting.png?fit=1105%2C656&ssl=1","width":1105,"height":656},{"@type":"BreadcrumbList","@id":"https:\/\/blexin.com\/it\/blog\/angular-testing-non-mi-fai-paura\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/blexin.com\/it\/"},{"@type":"ListItem","position":2,"name":"Angular Testing non mi fai paura"}]},{"@type":"WebSite","@id":"https:\/\/blexin.com\/it\/#website","url":"https:\/\/blexin.com\/it\/","name":"Blexin","description":"Con noi \u00e8 semplice","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blexin.com\/it\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"it-IT"},{"@type":"Person","@id":"https:\/\/blexin.com\/it\/#\/schema\/person\/0de430b61c8a48b0e9d81308817c1517","name":"Adolfo Arnold","image":{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/secure.gravatar.com\/avatar\/ff2a87b54d0f130d7452164533199af05ef16dbd08b9241729946cea0eec7cca?s=96&d=identicon&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/ff2a87b54d0f130d7452164533199af05ef16dbd08b9241729946cea0eec7cca?s=96&d=identicon&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/ff2a87b54d0f130d7452164533199af05ef16dbd08b9241729946cea0eec7cca?s=96&d=identicon&r=g","caption":"Adolfo Arnold"},"url":"https:\/\/blexin.com\/it\/author\/adolfo-arnoldblexin-com\/"}]}},"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2021\/01\/1105x656_w_blog-angulartesting.png?fit=1105%2C656&ssl=1","jetpack_shortlink":"https:\/\/wp.me\/pcyUBx-8eF","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/posts\/31661","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/users\/196716250"}],"replies":[{"embeddable":true,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/comments?post=31661"}],"version-history":[{"count":23,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/posts\/31661\/revisions"}],"predecessor-version":[{"id":31698,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/posts\/31661\/revisions\/31698"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/media\/31662"}],"wp:attachment":[{"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/media?parent=31661"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/categories?post=31661"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/tags?post=31661"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}