{"id":28628,"date":"2019-05-15T00:00:00","date_gmt":"2019-05-14T22:00:00","guid":{"rendered":"https:\/\/blexin.com\/?p=28628"},"modified":"2021-01-13T09:40:36","modified_gmt":"2021-01-13T08:40:36","slug":"tdd-tutto-il-codice-e-colpevole-fino-a-prova-contraria","status":"publish","type":"post","link":"https:\/\/blexin.com\/it\/blog\/tdd-tutto-il-codice-e-colpevole-fino-a-prova-contraria\/","title":{"rendered":"TDD: tutto il codice \u00e8 colpevole fino a prova contraria!"},"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=\"28629\" data-permalink=\"https:\/\/blexin.com\/it\/blog\/tdd-tutto-il-codice-e-colpevole-fino-a-prova-contraria\/attachment\/a16452f3-251a-4e86-90e2-9587547457a6\/\" data-orig-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/a16452f3-251a-4e86-90e2-9587547457a6.png?fit=1024%2C608&amp;ssl=1\" data-orig-size=\"1024,608\" 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=\"a16452f3-251a-4e86-90e2-9587547457a6\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/a16452f3-251a-4e86-90e2-9587547457a6.png?fit=300%2C178&amp;ssl=1\" data-large-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/a16452f3-251a-4e86-90e2-9587547457a6.png?fit=1024%2C608&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/a16452f3-251a-4e86-90e2-9587547457a6.png?resize=1024%2C608&#038;ssl=1\" alt=\"\" class=\"wp-image-28629\" srcset=\"https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/a16452f3-251a-4e86-90e2-9587547457a6.png 1024w, https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/a16452f3-251a-4e86-90e2-9587547457a6-980x582.png 980w, https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/a16452f3-251a-4e86-90e2-9587547457a6-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\">Lavorando con un nostro partner su un progetto di un cliente, ho avuto l&#8217;opportunit\u00e0 di approcciare lo sviluppo di alcuni task con una pratica di cui avevo sempre sentito parlare ma che non avevo mai utilizzato prima:&nbsp;<strong>Test Driven Development (TDD)<\/strong>. Questa pratica consiste nello scrivere i test del codice che sviluppiamo prima ancora di scrivere il codice stesso!<br>Considerando che ad oggi \u00e8 difficile trovare progetti su cui si riesca&nbsp;ad avere delle batterie di test, questa esperienza mi ha davvero colpito soprattuto per il valore aggiunto che un approccio del genere pu\u00f2 dare allo sviluppo software.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">I principi di questa disciplina sono stati definiti in maniera molto dettagliata da&nbsp;<strong><a href=\"https:\/\/en.wikipedia.org\/wiki\/Robert_C._Martin\" target=\"_blank\" rel=\"noreferrer noopener\">Uncle Bob<\/a><\/strong>&nbsp;e sono i seguenti:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><em>You are not allowed to write any production code unless it is to make a failing unit test pass.<\/em><\/li><li><em>You are not allowed to write any more of a unit test than is sufficient to fail; and compilation failures are failures.<\/em><\/li><li><em>You are not allowed to write any more production code than is sufficient to pass the one failing unit test.<\/em><\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Sinteticamente, la cosa da tenere presente quando si utilizza questa metodologia \u00e8:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>&#8220;Only ever write code to fix a failing test&#8221;<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">ovvero scrivere codice solo per evitare che un test fallisca.<\/p>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"le-tre-fasi-di-tdd-red-green-refactor\"><strong>Le tre fasi di TDD: Red, Green, Refactor<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Test Driven Development si fonda su 3 fasi: Red, Green, Refactor.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"996\" height=\"662\" data-attachment-id=\"28632\" data-permalink=\"https:\/\/blexin.com\/it\/blog\/tdd-tutto-il-codice-e-colpevole-fino-a-prova-contraria\/attachment\/print\/\" data-orig-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/tdd.jpg?fit=996%2C662&amp;ssl=1\" data-orig-size=\"996,662\" 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;Print&quot;,&quot;orientation&quot;:&quot;1&quot;}\" data-image-title=\"Print\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/tdd.jpg?fit=300%2C199&amp;ssl=1\" data-large-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/tdd.jpg?fit=996%2C662&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/tdd.jpg?resize=996%2C662&#038;ssl=1\" alt=\"\" class=\"wp-image-28632\" srcset=\"https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/tdd.jpg 996w, https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/tdd-980x651.jpg 980w, https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/tdd-480x319.jpg 480w\" sizes=\"auto, (min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 996px, 100vw\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"fase-rossa\"><strong>Fase Rossa<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">In questa fase si deve scrivere un comportamento che si vuole testare senza pensare al modo in cui il codice reale deve essere implementato. Occorre identificare solo come deve comportarsi con determinati input.<br>Se stai pensando a come implementarlo,&nbsp;<strong>stai sbagliando!<\/strong><br>In questa fase vanno prese solo decisioni su come il tuo codice verr\u00e0 utilizzato.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"fase-verde\"><strong>Fase Verde<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Questa \u00e8 la fase che piace a noi programmatori, scrivere codice.<br>L&#8217;errore pi\u00f9 comune che si pu\u00f2 fare in questa fase \u00e8 quello di pensare ad implementare il comportamento atteso dal test nel miglior modo possibile magari andando a complicarlo per sviluppi futuri.<br>Anche in questo caso&nbsp;<strong>stai sbagliando!<\/strong><br>Va scritto il codice sufficiente per far passare il test da rosso a verde, senza stare a pensare se si sta duplicando codice oppure non si stanno seguendo le&nbsp;<em>Best Practices<\/em>, non \u00e8 in questa fase che vanno fatte queste considerazioni.<br>Il Test Driven Development mette a disposizione una&nbsp;<strong><em>to-do list<\/em><\/strong>&nbsp;in cui annotare tutto quello che occorre per il completamento della funzionalit\u00e0 che stiamo implementando. La stessa lista contiene inoltre i dubbi o i problemi che si scoprono man mano che si scrive codice. Al termine dell&#8217;intero processo tale lista dovr\u00e0 risultare necessariamente vuota.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"fase-di-refactoring\"><strong>Fase di Refactoring<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">L&#8217;ultima fase del processo ha uno scopo ben preciso, migliorare il codice senza cambiarne il comportamento.<br>Abbiamo il nostro test verde che ci garantisce che la funzionalit\u00e0 che abbiamo implementato faccia ci\u00f2 che deve e non ci resta quindi che rendere il codice migliore.<br>E&#8217; il momento di togliere tutto il codice superfluo, guardare ci\u00f2 che si \u00e8 scritto con un occhio critico e applicare le best practices.<br>Terminata questa fase siamo pronti per ricominciare con la fase rossa.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"la-parte-divertente\"><strong>La parte divertente<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Una volta compreso la modalit\u00e0 operativa voglio provare ad applicare questa metodologia con un esempio molto semplice: il focus deve essere sull&#8217;approccio e non sulla complessit\u00e0 dell&#8217;esempio! Creiamo un&#8217;applicazione Web API in .NET Core che abbia come unica funzionalit\u00e0 quella di accogliere una richiesta GET con un custom header, e restituirmi un\u00a0<strong>202 (Accepted)<\/strong>\u00a0nel caso in cui il custom header sia corretto, oppure un\u00a0<strong>401 (Unauthorized)<\/strong>\u00a0nel caso non sia corretto o assente.<br>Utilizzo i template di VisualStudio per essere pi\u00f9 rapido possibile nella creazione della nuova soluzione.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"712\" data-attachment-id=\"28635\" data-permalink=\"https:\/\/blexin.com\/it\/blog\/tdd-tutto-il-codice-e-colpevole-fino-a-prova-contraria\/attachment\/step1\/\" data-orig-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/step1.png?fit=1178%2C819&amp;ssl=1\" data-orig-size=\"1178,819\" 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=\"step1\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/step1.png?fit=300%2C209&amp;ssl=1\" data-large-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/step1.png?fit=1024%2C712&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/step1.png?resize=1024%2C712&#038;ssl=1\" alt=\"\" class=\"wp-image-28635\" srcset=\"https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/step1-1024x712.png 1024w, https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/step1-980x681.png 980w, https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/step1-480x334.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<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"983\" height=\"693\" data-attachment-id=\"28637\" data-permalink=\"https:\/\/blexin.com\/it\/blog\/tdd-tutto-il-codice-e-colpevole-fino-a-prova-contraria\/attachment\/step2\/\" data-orig-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/step2.png?fit=983%2C693&amp;ssl=1\" data-orig-size=\"983,693\" 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=\"step2\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/step2.png?fit=300%2C211&amp;ssl=1\" data-large-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/step2.png?fit=983%2C693&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/step2.png?resize=983%2C693&#038;ssl=1\" alt=\"\" class=\"wp-image-28637\" srcset=\"https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/step2.png 983w, https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/step2-980x691.png 980w, https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/step2-480x338.png 480w\" sizes=\"auto, (min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 983px, 100vw\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Aggiungo un ulteriore progetto alla solution, per la gestione dei 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=\"709\" data-attachment-id=\"28639\" data-permalink=\"https:\/\/blexin.com\/it\/blog\/tdd-tutto-il-codice-e-colpevole-fino-a-prova-contraria\/attachment\/step3\/\" data-orig-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/step3.png?fit=1181%2C818&amp;ssl=1\" data-orig-size=\"1181,818\" 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=\"step3\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/step3.png?fit=300%2C208&amp;ssl=1\" data-large-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/step3.png?fit=1024%2C709&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/step3.png?resize=1024%2C709&#038;ssl=1\" alt=\"\" class=\"wp-image-28639\" srcset=\"https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/step3-1024x709.png 1024w, https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/step3-980x679.png 980w, https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/step3-480x332.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 questo modo ho la mia Solution con al suo interno due progetti, uno per il test e l&#8217;altro per l&#8217;API che vogliamo creare.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"707\" height=\"659\" data-attachment-id=\"28642\" data-permalink=\"https:\/\/blexin.com\/it\/blog\/tdd-tutto-il-codice-e-colpevole-fino-a-prova-contraria\/attachment\/step4\/\" data-orig-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/step4.png?fit=707%2C659&amp;ssl=1\" data-orig-size=\"707,659\" 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=\"step4\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/step4.png?fit=300%2C280&amp;ssl=1\" data-large-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/step4.png?fit=707%2C659&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/step4.png?resize=707%2C659&#038;ssl=1\" alt=\"\" class=\"wp-image-28642\" srcset=\"https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/step4.png 707w, https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/step4-480x447.png 480w\" sizes=\"auto, (min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) 707px, 100vw\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Facciamo un po&#8217;&nbsp;di pulizia delle classi create dal template, andando ad eliminare&nbsp;<em>ValueController.cs<\/em>&nbsp;e&nbsp;<em>UnitTest1.cs<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Creiamo le classi DemoControllerTest nel progetto dei test e DemoController nel progetto delle API.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\nusing Microsoft.VisualStudio.TestTools.UnitTesting;\n\u00a0\nnamespace TddStepToStep.Tests\n{\n\u00a0\u00a0\u00a0\u00a0&#x5B;TestClass]\n\u00a0\u00a0\u00a0\u00a0public class DemoControllerTest\n\u00a0\u00a0\u00a0\u00a0{\n\u00a0\u00a0\u00a0\u00a0}\n}\n<\/pre><\/div>\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\nusing Microsoft.AspNetCore.Mvc;\n\u00a0\nnamespace TddStepToStep.Controllers\n{\n\u00a0\u00a0\u00a0\u00a0&#x5B;Route(&quot;api\/&#x5B;controller]&quot;)]\n\u00a0\u00a0\u00a0\u00a0&#x5B;ApiController]\n\u00a0\u00a0\u00a0\u00a0public class DemoController : ControllerBase\n\u00a0\u00a0\u00a0\u00a0{\u00a0\u00a0 \n\u00a0\u00a0\u00a0\u00a0}\n}\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">specifichiamo il target del test, ovvero la classe DemoController:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\nprivate DemoController _target;\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Aggiungiamo un metodo per inizializzare la classe di test in cui creiamo l&#8217;istanza di DemoController passandogli una classe di configurazione. Nella classe di configurazione \u00e8 presente la propriet\u00e0 ApiKey che verr\u00e0 utilizzata per determinare se il valore passato dalla richiesta \u00e8 corretto.<br>Ovviamente il compilatore ci dir\u00e0 che non esiste nessuna classe\u00a0<em>DemoControllerConfig<\/em>, che\u00a0<em>DemoController<\/em>\u00a0non ha nessun costruttore che accetta un parametro di quel tipo e che non ha la minima idea di chi sia\u00a0<em>CORRECT_API_KEY<\/em>.<br><br>Partiamo dalla cosa pi\u00f9 semplice, creare la costante\u00a0<em>CORRECT_API_KEY<\/em><\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\npublic const string CORRECT_API_KEY = &quot;1234&quot;;\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Poi creiamo la classe\u00a0<em>DemoControllerConfig<\/em>\u00a0nel progetto API, inizialmente vuota ma facendoci aiutare da VS tramite lo shortcut\u00a0<strong>CTRL + &#8216;.&#8217;<\/strong>\u00a0che ci suggerir\u00e0 di aggiungere una proprieta\u00a0<em>ApiKey<\/em>\u00a0alla classe. Stessa identica cosa la facciamo per creare il costruttore e relativa propriet\u00e0 privata per\u00a0<em>DemoController<\/em>:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\nusing TddStepToStep.Controllers;\n\u00a0\nnamespace TddStepToStep.Tests\n{\n\u00a0\u00a0\u00a0\u00a0&#x5B;TestClass]\n\u00a0\u00a0\u00a0\u00a0public class DemoControllerTest\n\u00a0\u00a0\u00a0\u00a0{\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0public const string CORRECT_API_KEY = &quot;1234&quot;;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0private DemoController _target;\n\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&#x5B;TestInitialize]\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0public void Init()\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0_target = new DemoController(new DemoControllerConfig() { ApiKey = CORRECT_API_KEY });\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\n\u00a0\u00a0\u00a0\u00a0}\n}\n<\/pre><\/div>\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\nusing Microsoft.AspNetCore.Mvc;\n\u00a0\nnamespace TddStepToStep.Controllers\n{\n\u00a0\u00a0\u00a0\u00a0&#x5B;Route(&quot;api\/&#x5B;controller]&quot;)]\n\u00a0\u00a0\u00a0\u00a0&#x5B;ApiController]\n\u00a0\u00a0\u00a0\u00a0public class DemoController : ControllerBase\n\u00a0\u00a0\u00a0\u00a0{\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0private DemoControllerConfig demoControllerConfig;\n\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0public DemoController(DemoControllerConfig demoControllerConfig)\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0this.demoControllerConfig = demoControllerConfig;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\n\u00a0\u00a0\u00a0\u00a0}\n}\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">L&#8217;idea di passare una classe che contiene l&#8217;ApiKey al Controller invece di recuperarne il valore da un file di configurazione viene naturale quando si utilizza l&#8217;approccio test first: in questo modo stiamo separando la nostra logica da fattori esterni.<br>Lo step successivo \u00e8 quello di creare il test vero e proprio.<br>Voglio testare che quando arriva una richiesta HTTP in cui \u00e8 presente un determinato header con valore uguale a quello fornito, lo Status Code della risposta sia\u00a0<strong><em>202 accepted<\/em><\/strong>.<br>La scelta del nome del test deve rispecchiare esattamente quello che vogliamo testare, e un buon approccio \u00e8 quello di scrivere il nome del test seguendo questa convenzione\u00a0<em>Should_ExpectedBehavior_When_StateUnderTest<\/em>.<br>Quindi il nome del mio test sar\u00e0\u00a0<strong><em>ShouldReturnAcceptedResultWhenCorrectApiKeyIsPassed<\/em><\/strong>.<br>Per poter passare un Header ad un Controller, sono necessarie un paio di righe di codice<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\n_target.ControllerContext = new ControllerContext();\n_target.ControllerContext.HttpContext = new DefaultHttpContext();\n_target.ControllerContext.HttpContext.Request.Headers.Add(&quot;X-API-KEY&quot;, CORRECT_API_KEY);\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Per aggiungere un header creiamo un nuovo ControllerContext per il Controller che stiamo testando, a cui impostiamo un nuovo HttpContext dal quale possiamo accedere alla Request in questa troviamo gli Headers. Aggiungiamo quindi l&#8217;header\u00a0<strong><em>X-API-KEY<\/em><\/strong>\u00a0con il valore corretto. A questo punto possiamo simulare la chiamata all&#8217;API semplicemente invocando il metodo che risponde alla chiamata.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\nvar resp = _target.GetValues();\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Prensiamo la risposta ottenuta e la diamo in pasto all&#8217;<strong>Assert<\/strong>.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\nAssert.IsInstanceOfType(resp, typeof(AcceptedResult));\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Il compilatore avr\u00e0 da obiettare sull&#8217;inesistenza di\u00a0<em>GetValues()<\/em>, ma utilizzando il nostro fidato\u00a0<strong>CTRL + &#8216;.&#8217;<\/strong>\u00a0possiamo creare il metodo mancante che andremo poi ad implementare.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\n&#x5B;HttpGet]\npublic ActionResult GetValues()\n{\n\u00a0\u00a0\u00a0\u00a0throw new NotImplementedException();\n}\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Abbiamo finalmente il nostro metodo di test, che possiamo eseguire e che ci aspettiamo fallisca (fase\u00a0<strong><em>rossa<\/em><\/strong>):<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\n&#x5B;TestMethod]\npublic void ShouldReturnAcceptedResultWhenCorrectApiKeyIsPassed()\n{\n\u00a0\u00a0\u00a0\u00a0_target.ControllerContext = new ControllerContext();\n\u00a0\u00a0\u00a0\u00a0_target.ControllerContext.HttpContext = new DefaultHttpContext();\n\u00a0\u00a0\u00a0\u00a0_target.ControllerContext.HttpContext.Request.Headers.Add(&quot;X-API-KEY&quot;, CORRECT_API_KEY);\n\u00a0\u00a0\u00a0\u00a0var resp = _target.GetValues();\n\u00a0\u00a0\u00a0\u00a0Assert.IsInstanceOfType(resp, typeof(AcceptedResult));\n}\n<\/pre><\/div>\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"952\" height=\"800\" data-attachment-id=\"28647\" data-permalink=\"https:\/\/blexin.com\/it\/blog\/tdd-tutto-il-codice-e-colpevole-fino-a-prova-contraria\/attachment\/failed_test\/\" data-orig-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/failed_test.png?fit=952%2C800&amp;ssl=1\" data-orig-size=\"952,800\" 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=\"failed_test\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/failed_test.png?fit=300%2C252&amp;ssl=1\" data-large-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/failed_test.png?fit=952%2C800&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/failed_test.png?resize=952%2C800&#038;ssl=1\" alt=\"\" class=\"wp-image-28647\" srcset=\"https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/failed_test.png 952w, https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/failed_test-480x403.png 480w\" sizes=\"auto, (min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) 952px, 100vw\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Il test fallisce perch\u00e8 non abbiamo ancora implementato il metodo\u00a0<em>GetValues<\/em>\u00a0nel controller.<br>Quindi implementiamo il metodo in modo tale che il test risulti\u00a0<strong><em>verde<\/em><\/strong>.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\n&#x5B;HttpGet]\npublic ActionResult GetValues()\n{\n\u00a0\u00a0\u00a0\u00a0if (Request.Headers.ContainsKey(&quot;X-API-KEY&quot;) \n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&amp;&amp; Request.Headers&#x5B;&quot;X-API-KEY&quot;].Equals(demoControllerConfig.ApiKey))\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return Accepted();\n\u00a0\n\u00a0\u00a0\u00a0\u00a0return Ok();\n}\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Rieseguiamo il test:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"953\" height=\"803\" data-attachment-id=\"28649\" data-permalink=\"https:\/\/blexin.com\/it\/blog\/tdd-tutto-il-codice-e-colpevole-fino-a-prova-contraria\/attachment\/passed_test\/\" data-orig-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/passed_test.png?fit=953%2C803&amp;ssl=1\" data-orig-size=\"953,803\" 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=\"passed_test\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/passed_test.png?fit=300%2C253&amp;ssl=1\" data-large-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/passed_test.png?fit=953%2C803&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/passed_test.png?resize=953%2C803&#038;ssl=1\" alt=\"\" class=\"wp-image-28649\" srcset=\"https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/passed_test.png 953w, https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/passed_test-480x404.png 480w\" sizes=\"auto, (min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) 953px, 100vw\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Il primo requisito \u00e8 rispettato, ci manca di ottenere un 401 nel caso in cui la chiave non sia corretta.<br>Aggiungo il test e lo vado ad eseguire aspettandomi anche questa volta che fallisca.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\npublic const string WRONG_API_KEY = &quot;1235&quot;;\n<\/pre><\/div>\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\n&#x5B;TestMethod]\npublic void ShouldReturnUnauthorizedResultWhenWrongApiKeyIsPassed()\n{\n\u00a0\u00a0\u00a0\u00a0_target.ControllerContext = new ControllerContext();\n\u00a0\u00a0\u00a0\u00a0_target.ControllerContext.HttpContext = new DefaultHttpContext();\n\u00a0\u00a0\u00a0\u00a0_target.ControllerContext.HttpContext.Request.Headers.Add(&quot;X-API-KEY&quot;, WRONG_API_KEY);\n\u00a0\u00a0\u00a0\u00a0var resp = _target.GetValues();\n\u00a0\u00a0\u00a0\u00a0Assert.IsInstanceOfType(resp, typeof(UnauthorizedResult));\n}\n<\/pre><\/div>\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"952\" height=\"803\" data-attachment-id=\"28655\" data-permalink=\"https:\/\/blexin.com\/it\/blog\/tdd-tutto-il-codice-e-colpevole-fino-a-prova-contraria\/attachment\/second_test_failed\/\" data-orig-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/second_test_failed.png?fit=952%2C803&amp;ssl=1\" data-orig-size=\"952,803\" 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=\"second_test_failed\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/second_test_failed.png?fit=300%2C253&amp;ssl=1\" data-large-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/second_test_failed.png?fit=952%2C803&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/second_test_failed.png?resize=952%2C803&#038;ssl=1\" alt=\"\" class=\"wp-image-28655\" srcset=\"https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/second_test_failed.png 952w, https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/second_test_failed-480x405.png 480w\" sizes=\"auto, (min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) 952px, 100vw\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Il messaggio di errore che riceviamo dipende dal fatto che il test si aspetta un\u00a0<em>Unauthorized<\/em>\u00a0ma ha invece restituito un\u00a0<em>OK<\/em>.<br>Modifichiamo quindi il comportamento del metodo\u00a0<em>GetValues<\/em>:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\n&#x5B;HttpGet]\npublic ActionResult GetValues()\n{\n\u00a0\u00a0\u00a0\u00a0if (!Request.Headers.ContainsKey(&quot;X-API-KEY&quot;) \n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0|| !Request.Headers&#x5B;&quot;X-API-KEY&quot;].Equals(demoControllerConfig.ApiKey))\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return Unauthorized();\n\u00a0\n\u00a0\u00a0\u00a0\u00a0return Accepted();\n}\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Rieseguiamo i test:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"953\" height=\"802\" data-attachment-id=\"28652\" data-permalink=\"https:\/\/blexin.com\/it\/blog\/tdd-tutto-il-codice-e-colpevole-fino-a-prova-contraria\/attachment\/all_tests_passed\/\" data-orig-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/all_tests_passed.png?fit=953%2C802&amp;ssl=1\" data-orig-size=\"953,802\" 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=\"all_tests_passed\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/all_tests_passed.png?fit=300%2C252&amp;ssl=1\" data-large-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/all_tests_passed.png?fit=953%2C802&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/all_tests_passed.png?resize=953%2C802&#038;ssl=1\" alt=\"\" class=\"wp-image-28652\" srcset=\"https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/all_tests_passed.png 953w, https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/all_tests_passed-480x404.png 480w\" sizes=\"auto, (min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) 953px, 100vw\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Ottimo, obiettivo raggiunto.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In base a quanto detto prima per\u00f2, manca la fase di refactoring, che vi lascio come esercizio! Potete per esempio mettere parte del codice in un Action Filter&#8230;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Spero di avervi incuriosito.<br>Alla prossima.<\/p>\n\n\n\n\n","protected":false},"excerpt":{"rendered":"<p>Scopriamo come sfruttare la metodologia TDD per migliorare l&#8217;approccio allo sviluppo delle nostre applicazioni<\/p>\n","protected":false},"author":196716250,"featured_media":28629,"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_post_was_ever_published":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},"categories":[688637374],"tags":[688637414,688637409],"class_list":["post-28628","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blog","tag-asp-net-core","tag-testing"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.0 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>TDD: tutto il codice \u00e8 colpevole fino a prova contraria! - 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\/tdd-tutto-il-codice-e-colpevole-fino-a-prova-contraria\/\" \/>\n<meta property=\"og:locale\" content=\"it_IT\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"TDD: tutto il codice \u00e8 colpevole fino a prova contraria! - Blexin\" \/>\n<meta property=\"og:description\" content=\"Scopriamo come sfruttare la metodologia TDD per migliorare l&#039;approccio allo sviluppo delle nostre applicazioni\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blexin.com\/it\/blog\/tdd-tutto-il-codice-e-colpevole-fino-a-prova-contraria\/\" \/>\n<meta property=\"og:site_name\" content=\"Blexin\" \/>\n<meta property=\"article:published_time\" content=\"2019-05-14T22:00:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2021-01-13T08:40:36+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/i2.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/a16452f3-251a-4e86-90e2-9587547457a6.png?fit=1024%2C608&ssl=1\" \/>\n\t<meta property=\"og:image:width\" content=\"1024\" \/>\n\t<meta property=\"og:image:height\" content=\"608\" \/>\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=\"7 minuti\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/blexin.com\/it\/blog\/tdd-tutto-il-codice-e-colpevole-fino-a-prova-contraria\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/blexin.com\/it\/blog\/tdd-tutto-il-codice-e-colpevole-fino-a-prova-contraria\/\"},\"author\":{\"name\":\"Adolfo Arnold\",\"@id\":\"https:\/\/blexin.com\/it\/#\/schema\/person\/0de430b61c8a48b0e9d81308817c1517\"},\"headline\":\"TDD: tutto il codice \u00e8 colpevole fino a prova contraria!\",\"datePublished\":\"2019-05-14T22:00:00+00:00\",\"dateModified\":\"2021-01-13T08:40:36+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/blexin.com\/it\/blog\/tdd-tutto-il-codice-e-colpevole-fino-a-prova-contraria\/\"},\"wordCount\":1210,\"image\":{\"@id\":\"https:\/\/blexin.com\/it\/blog\/tdd-tutto-il-codice-e-colpevole-fino-a-prova-contraria\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/a16452f3-251a-4e86-90e2-9587547457a6.png?fit=1024%2C608&ssl=1\",\"keywords\":[\"Asp.net core\",\"Testing\"],\"articleSection\":[\"Blog\"],\"inLanguage\":\"it-IT\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/blexin.com\/it\/blog\/tdd-tutto-il-codice-e-colpevole-fino-a-prova-contraria\/\",\"url\":\"https:\/\/blexin.com\/it\/blog\/tdd-tutto-il-codice-e-colpevole-fino-a-prova-contraria\/\",\"name\":\"TDD: tutto il codice \u00e8 colpevole fino a prova contraria! - Blexin\",\"isPartOf\":{\"@id\":\"https:\/\/blexin.com\/it\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/blexin.com\/it\/blog\/tdd-tutto-il-codice-e-colpevole-fino-a-prova-contraria\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/blexin.com\/it\/blog\/tdd-tutto-il-codice-e-colpevole-fino-a-prova-contraria\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/a16452f3-251a-4e86-90e2-9587547457a6.png?fit=1024%2C608&ssl=1\",\"datePublished\":\"2019-05-14T22:00:00+00:00\",\"dateModified\":\"2021-01-13T08:40:36+00:00\",\"author\":{\"@id\":\"https:\/\/blexin.com\/it\/#\/schema\/person\/0de430b61c8a48b0e9d81308817c1517\"},\"breadcrumb\":{\"@id\":\"https:\/\/blexin.com\/it\/blog\/tdd-tutto-il-codice-e-colpevole-fino-a-prova-contraria\/#breadcrumb\"},\"inLanguage\":\"it-IT\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/blexin.com\/it\/blog\/tdd-tutto-il-codice-e-colpevole-fino-a-prova-contraria\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\/\/blexin.com\/it\/blog\/tdd-tutto-il-codice-e-colpevole-fino-a-prova-contraria\/#primaryimage\",\"url\":\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/a16452f3-251a-4e86-90e2-9587547457a6.png?fit=1024%2C608&ssl=1\",\"contentUrl\":\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/a16452f3-251a-4e86-90e2-9587547457a6.png?fit=1024%2C608&ssl=1\",\"width\":1024,\"height\":608},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/blexin.com\/it\/blog\/tdd-tutto-il-codice-e-colpevole-fino-a-prova-contraria\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/blexin.com\/it\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"TDD: tutto il codice \u00e8 colpevole fino a prova contraria!\"}]},{\"@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:\/\/blexin.com\/it\/#\/schema\/person\/image\/\",\"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":"TDD: tutto il codice \u00e8 colpevole fino a prova contraria! - 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\/tdd-tutto-il-codice-e-colpevole-fino-a-prova-contraria\/","og_locale":"it_IT","og_type":"article","og_title":"TDD: tutto il codice \u00e8 colpevole fino a prova contraria! - Blexin","og_description":"Scopriamo come sfruttare la metodologia TDD per migliorare l'approccio allo sviluppo delle nostre applicazioni","og_url":"https:\/\/blexin.com\/it\/blog\/tdd-tutto-il-codice-e-colpevole-fino-a-prova-contraria\/","og_site_name":"Blexin","article_published_time":"2019-05-14T22:00:00+00:00","article_modified_time":"2021-01-13T08:40:36+00:00","og_image":[{"width":1024,"height":608,"url":"https:\/\/i2.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/a16452f3-251a-4e86-90e2-9587547457a6.png?fit=1024%2C608&ssl=1","type":"image\/png"}],"author":"Adolfo Arnold","twitter_card":"summary_large_image","twitter_misc":{"Scritto da":"Adolfo Arnold","Tempo di lettura stimato":"7 minuti"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/blexin.com\/it\/blog\/tdd-tutto-il-codice-e-colpevole-fino-a-prova-contraria\/#article","isPartOf":{"@id":"https:\/\/blexin.com\/it\/blog\/tdd-tutto-il-codice-e-colpevole-fino-a-prova-contraria\/"},"author":{"name":"Adolfo Arnold","@id":"https:\/\/blexin.com\/it\/#\/schema\/person\/0de430b61c8a48b0e9d81308817c1517"},"headline":"TDD: tutto il codice \u00e8 colpevole fino a prova contraria!","datePublished":"2019-05-14T22:00:00+00:00","dateModified":"2021-01-13T08:40:36+00:00","mainEntityOfPage":{"@id":"https:\/\/blexin.com\/it\/blog\/tdd-tutto-il-codice-e-colpevole-fino-a-prova-contraria\/"},"wordCount":1210,"image":{"@id":"https:\/\/blexin.com\/it\/blog\/tdd-tutto-il-codice-e-colpevole-fino-a-prova-contraria\/#primaryimage"},"thumbnailUrl":"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/a16452f3-251a-4e86-90e2-9587547457a6.png?fit=1024%2C608&ssl=1","keywords":["Asp.net core","Testing"],"articleSection":["Blog"],"inLanguage":"it-IT"},{"@type":"WebPage","@id":"https:\/\/blexin.com\/it\/blog\/tdd-tutto-il-codice-e-colpevole-fino-a-prova-contraria\/","url":"https:\/\/blexin.com\/it\/blog\/tdd-tutto-il-codice-e-colpevole-fino-a-prova-contraria\/","name":"TDD: tutto il codice \u00e8 colpevole fino a prova contraria! - Blexin","isPartOf":{"@id":"https:\/\/blexin.com\/it\/#website"},"primaryImageOfPage":{"@id":"https:\/\/blexin.com\/it\/blog\/tdd-tutto-il-codice-e-colpevole-fino-a-prova-contraria\/#primaryimage"},"image":{"@id":"https:\/\/blexin.com\/it\/blog\/tdd-tutto-il-codice-e-colpevole-fino-a-prova-contraria\/#primaryimage"},"thumbnailUrl":"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/a16452f3-251a-4e86-90e2-9587547457a6.png?fit=1024%2C608&ssl=1","datePublished":"2019-05-14T22:00:00+00:00","dateModified":"2021-01-13T08:40:36+00:00","author":{"@id":"https:\/\/blexin.com\/it\/#\/schema\/person\/0de430b61c8a48b0e9d81308817c1517"},"breadcrumb":{"@id":"https:\/\/blexin.com\/it\/blog\/tdd-tutto-il-codice-e-colpevole-fino-a-prova-contraria\/#breadcrumb"},"inLanguage":"it-IT","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blexin.com\/it\/blog\/tdd-tutto-il-codice-e-colpevole-fino-a-prova-contraria\/"]}]},{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/blexin.com\/it\/blog\/tdd-tutto-il-codice-e-colpevole-fino-a-prova-contraria\/#primaryimage","url":"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/a16452f3-251a-4e86-90e2-9587547457a6.png?fit=1024%2C608&ssl=1","contentUrl":"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/a16452f3-251a-4e86-90e2-9587547457a6.png?fit=1024%2C608&ssl=1","width":1024,"height":608},{"@type":"BreadcrumbList","@id":"https:\/\/blexin.com\/it\/blog\/tdd-tutto-il-codice-e-colpevole-fino-a-prova-contraria\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/blexin.com\/it\/"},{"@type":"ListItem","position":2,"name":"TDD: tutto il codice \u00e8 colpevole fino a prova contraria!"}]},{"@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:\/\/blexin.com\/it\/#\/schema\/person\/image\/","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\/2020\/12\/a16452f3-251a-4e86-90e2-9587547457a6.png?fit=1024%2C608&ssl=1","jetpack_shortlink":"https:\/\/wp.me\/pcyUBx-7rK","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/posts\/28628","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=28628"}],"version-history":[{"count":10,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/posts\/28628\/revisions"}],"predecessor-version":[{"id":28658,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/posts\/28628\/revisions\/28658"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/media\/28629"}],"wp:attachment":[{"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/media?parent=28628"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/categories?post=28628"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/tags?post=28628"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}