{"id":1274,"date":"2021-04-22T16:52:39","date_gmt":"2021-04-22T16:52:39","guid":{"rendered":"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/?p=1274"},"modified":"2021-04-27T09:36:28","modified_gmt":"2021-04-27T09:36:28","slug":"testeando-nuestras-azure-functions","status":"publish","type":"post","link":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/testeando-nuestras-azure-functions\/","title":{"rendered":"Testeando nuestras Azure Functions"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1295\" src=\"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2021\/04\/testeando-functions.png\" alt=\"\" width=\"593\" height=\"339\" srcset=\"https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2021\/04\/testeando-functions.png 593w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2021\/04\/testeando-functions-300x172.png 300w\" sizes=\"auto, (max-width: 593px) 100vw, 593px\" \/><\/p>\n<p><strong>Azure\u00a0Functions<\/strong><span data-contrast=\"auto\">\u00a0pone a nuestra disposici\u00f3n una forma maravillosa de ejecutar tareas de forma\u00a0<\/span><span data-contrast=\"auto\">manual o\u00a0<\/span><span data-contrast=\"auto\">desatendida en un entorno <\/span><span data-contrast=\"auto\">cloud<\/span><span data-contrast=\"auto\">\u00a0y\u00a0<\/span><span data-contrast=\"auto\">serverless<\/span><span data-contrast=\"auto\">.<\/span><span data-contrast=\"auto\">\u00a0Podemos\u00a0<\/span><span data-contrast=\"auto\">programar tareas de todo tipo en respuesta a multitud de eventos, ya sea una llamada Http, un temporizador<\/span><span data-contrast=\"auto\">\u00a0o<\/span><span data-contrast=\"auto\">\u00a0la subida\u00a0<\/span><span data-contrast=\"auto\">de un documento a un\u00a0<\/span><span data-contrast=\"auto\">storage<\/span><span data-contrast=\"auto\">,<\/span><span data-contrast=\"auto\"> por poner algunos ejemplos.<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span><\/p>\n<p><!--more--><\/p>\n<p><span data-contrast=\"auto\">Desde el momento en el que estamos\u00a0<\/span><span data-contrast=\"auto\">generando c\u00f3digo<\/span><span data-contrast=\"auto\">\u00a0para nuestras\u00a0<\/span><span data-contrast=\"auto\">F<\/span><span data-contrast=\"auto\">unctions<\/span><span data-contrast=\"auto\">,\u00a0<\/span><span data-contrast=\"auto\">nos interesa acompa\u00f1ar este c\u00f3digo de unos\u00a0<\/span><span data-contrast=\"auto\">test<\/span><span data-contrast=\"auto\">s<\/span><span data-contrast=\"auto\">\u00a0que nos aseguren que lo que estamos desarrollando funciona correctamente y que nos protejan de futuras regresiones a la hora de ampliar alguna funcionalidad<\/span><span data-contrast=\"auto\">.<\/span><span data-contrast=\"auto\"> En este art\u00edculo os <\/span><span data-contrast=\"auto\">mostraremos c\u00f3mo testear nuestras <\/span><span data-contrast=\"auto\">A<\/span><span data-contrast=\"auto\">zure\u00a0<\/span><span data-contrast=\"auto\">F<\/span><span data-contrast=\"auto\">unctions<\/span><span data-contrast=\"auto\">\u00a0usando\u00a0<\/span><b><span data-contrast=\"auto\">xUnit<\/span><\/b><span data-contrast=\"auto\">\u00a0<\/span><span data-contrast=\"auto\">y\u00a0<\/span><b><span data-contrast=\"auto\">Moq<\/span><\/b><span data-contrast=\"auto\">\u00a0en un proyecto de\u00a0<\/span><span data-contrast=\"auto\">F<\/span><span data-contrast=\"auto\">unctions, <\/span><span data-contrast=\"auto\">realizando acciones sobre una cuenta de almacenamiento con <\/span><b><span data-contrast=\"auto\">blobs<\/span><\/b><span data-contrast=\"auto\">\u00a0en Azure<\/span><span data-contrast=\"auto\">.<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span><\/p>\n<p><span data-contrast=\"auto\">Tendr\u00e9is<\/span><span data-contrast=\"auto\">\u00a0todo el c\u00f3digo subido en este repositorio de\u00a0<\/span><span style=\"color: #0000ff\"><a style=\"color: #0000ff\" href=\"https:\/\/github.com\/AndresSanRo\/TestingAzureFunctions\">GitHub<\/a><\/span><span data-contrast=\"auto\">, separado en ramas para que sea m\u00e1s c\u00f3modo de seguir seg\u00fan\u00a0<\/span><span data-contrast=\"auto\">vamos avanzando en el art\u00edculo.<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span><\/p>\n<h2><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span><span data-contrast=\"auto\">Nuestro punto de partida<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span><\/h2>\n<p><span data-contrast=\"auto\">Desde<\/span><span data-contrast=\"auto\">\u00a0la rama \u201cstep-0-start\u201d tenemos un proyecto de\u00a0<\/span><span data-contrast=\"auto\">F<\/span><span data-contrast=\"auto\">unctions<\/span><span data-contrast=\"auto\">\u00a0listo para empezar a\u00a0<\/span><span data-contrast=\"auto\">hacer\u00a0<\/span><span data-contrast=\"auto\">tests<\/span><span data-contrast=\"auto\">\u00a0sobre\u00a0<\/span><span data-contrast=\"auto\">A<\/span><span data-contrast=\"auto\">zure\u00a0<\/span><span data-contrast=\"auto\">F<\/span><span data-contrast=\"auto\">unctions<\/span><span data-contrast=\"auto\">.<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span><\/p>\n<p><span data-contrast=\"auto\">Por una\u00a0<\/span><span data-contrast=\"auto\">parte,<\/span><span data-contrast=\"auto\">\u00a0tenemos un\u00a0<\/span><b><i><span data-contrast=\"auto\">BlobStorageService<\/span><\/i><\/b><b><i><span data-contrast=\"auto\">\u00a0<\/span><\/i><\/b><span data-contrast=\"auto\">que nos ayudar\u00e1 <\/span><span data-contrast=\"auto\">a realizar acciones con nuestra cuenta de almacenamiento y nuestros blobs<\/span><span data-contrast=\"auto\">.<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span><\/p>\n<p><div id=\"attachment_1276\" style=\"width: 312px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-1276\" class=\"wp-image-1276 size-full\" title=\"\u00a0BlobStorageService\" src=\"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2021\/04\/Imagen1.png\" alt=\"\u00a0BlobStorageService\" width=\"302\" height=\"191\" srcset=\"https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2021\/04\/Imagen1.png 302w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2021\/04\/Imagen1-300x190.png 300w\" sizes=\"auto, (max-width: 302px) 100vw, 302px\" \/><p id=\"caption-attachment-1276\" class=\"wp-caption-text\">BlobStorageService<\/p><\/div><\/p>\n<p><span data-contrast=\"auto\">Y<\/span><span data-contrast=\"auto\">\u00a0tenemos<\/span><span data-contrast=\"auto\">\u00a0configurado este servicio en nuestra\u00a0<\/span><span data-contrast=\"auto\">in<\/span><span data-contrast=\"auto\">yecci\u00f3n de dependencias. Esto es importante<\/span><span data-contrast=\"auto\">\u00a0(<\/span><span data-contrast=\"auto\">a<\/span><span data-contrast=\"auto\">l margen de<\/span><span data-contrast=\"auto\">\u00a0ser una buena pr\u00e1ctica<\/span><span data-contrast=\"auto\">)<\/span><span data-contrast=\"auto\">\u00a0para poder\u00a0<\/span><b><span data-contrast=\"auto\">mockear<\/span><\/b><b><span data-contrast=\"auto\">\u00a0<\/span><\/b><span data-contrast=\"auto\">este servicio usando la librer\u00eda\u00a0<\/span><b><span data-contrast=\"auto\">Moq<\/span><\/b><span data-contrast=\"auto\">\u00a0en nuestros\u00a0<\/span><span data-contrast=\"auto\">tests<\/span><span data-contrast=\"auto\">.<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span><\/p>\n<p><span data-contrast=\"auto\">Por otra parte,<\/span><span data-contrast=\"auto\">\u00a0tenemos un proyecto de Azure\u00a0<\/span><span data-contrast=\"auto\">F<\/span><span data-contrast=\"auto\">unctions<\/span><span data-contrast=\"auto\">\u00a0<\/span><span data-contrast=\"auto\">con dos funciones<\/span><span data-contrast=\"auto\">:<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span><\/p>\n<ul>\n<li data-leveltext=\"\uf0b7\" data-font=\"Symbol\" data-listid=\"1\" data-aria-posinset=\"1\" data-aria-level=\"1\"><span data-contrast=\"auto\">Una\u00a0<\/span><b><i><span data-contrast=\"auto\">HttpTrigger<\/span><\/i><\/b><b><i><span data-contrast=\"auto\">\u00a0<\/span><\/i><\/b><b><i><span data-contrast=\"auto\">function<\/span><\/i><\/b><span data-contrast=\"auto\">\u00a0llamada \u201c<\/span><span data-contrast=\"auto\">GetBlobsList<\/span><span data-contrast=\"auto\">\u201d, que lee todos los blobs que hay en nuestro blob container<\/span><span data-contrast=\"auto\">\u00a0y devuelve sus nombres en forma de array.<\/span><span data-ccp-props=\"{&quot;134233279&quot;:true,&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span><\/li>\n<li data-leveltext=\"\uf0b7\" data-font=\"Symbol\" data-listid=\"1\" data-aria-posinset=\"2\" data-aria-level=\"1\"><span data-contrast=\"auto\">U<\/span><span data-contrast=\"auto\">na\u00a0<\/span><b><i><span data-contrast=\"auto\">TimeTrigger<\/span><\/i><\/b><b><i><span data-contrast=\"auto\">\u00a0<\/span><\/i><\/b><b><i><span data-contrast=\"auto\">function<\/span><\/i><\/b><span data-contrast=\"auto\">\u00a0que lee el contenido de<\/span><span data-contrast=\"auto\">l blob \u201cdoc1.txt\u201d, y\u00a0<\/span><span data-contrast=\"auto\">traza<\/span><span data-contrast=\"auto\">\u00a0por consola el contenido del archivo<\/span><span data-contrast=\"auto\">.<\/span><span data-ccp-props=\"{&quot;134233279&quot;:true,&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span><\/li>\n<\/ul>\n<p><div id=\"attachment_1277\" style=\"width: 355px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-1277\" class=\"wp-image-1277 size-full\" title=\"proyecto de Azure\u00a0Functions\u00a0con dos funciones\" src=\"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2021\/04\/Imagen2.png\" alt=\"proyecto de Azure\u00a0Functions\u00a0con dos funciones\" width=\"345\" height=\"295\" srcset=\"https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2021\/04\/Imagen2.png 345w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2021\/04\/Imagen2-300x257.png 300w\" sizes=\"auto, (max-width: 345px) 100vw, 345px\" \/><p id=\"caption-attachment-1277\" class=\"wp-caption-text\">Proyecto de Azure\u00a0Functions\u00a0con dos funciones<\/p><\/div><\/p>\n<h2><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span><span data-contrast=\"auto\">\u00a1Empezamos!<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span><\/h2>\n<p><span data-contrast=\"auto\">Vamos a a\u00f1adir una nueva carpeta dentro de la soluci\u00f3n llamada \u201c04-Tests\u201d<\/span><span data-contrast=\"auto\">\u00a0y ah\u00ed a\u00f1adiremos un nuevo proyecto de\u00a0<\/span><span data-contrast=\"auto\">tests<\/span><span data-contrast=\"auto\">\u00a0<\/span><b><span data-contrast=\"auto\">xUni<\/span><\/b><b><span data-contrast=\"auto\">t<\/span><\/b><b><span data-contrast=\"auto\">\u00a0<\/span><\/b><span data-contrast=\"auto\">que<\/span><span data-contrast=\"auto\">\u00a0llamaremos \u201c<\/span><b><span data-contrast=\"auto\">TestingAzureFunctions.Tests<\/span><\/b><span data-contrast=\"auto\">\u201d<\/span><span data-contrast=\"auto\">.<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span><\/p>\n<p><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\"> <img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-1278 size-full\" title=\"\u00a0tests\u00a0xUnit\" src=\"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2021\/04\/Imagen3.png\" alt=\"\u00a0tests\u00a0xUnit\" width=\"567\" height=\"81\" srcset=\"https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2021\/04\/Imagen3.png 567w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2021\/04\/Imagen3-300x43.png 300w\" sizes=\"auto, (max-width: 567px) 100vw, 567px\" \/> <img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1279\" src=\"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2021\/04\/Imagen4.png\" alt=\"\" width=\"352\" height=\"152\" srcset=\"https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2021\/04\/Imagen4.png 352w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2021\/04\/Imagen4-300x130.png 300w\" sizes=\"auto, (max-width: 352px) 100vw, 352px\" \/><\/span><\/p>\n<p><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span><\/p>\n<p><span data-contrast=\"auto\">Despu\u00e9s, a\u00f1adiremos sobre este proyecto el paquete\u00a0<\/span><span data-contrast=\"auto\">NuGet<\/span><span data-contrast=\"auto\">\u00a0de\u00a0<\/span><b><span data-contrast=\"auto\">Moq<\/span><\/b><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span><\/p>\n<p><div id=\"attachment_1280\" style=\"width: 577px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-1280\" class=\"wp-image-1280 size-full\" title=\"A\u00f1adimos el paquete\u00a0NuGet\u00a0de\u00a0Moq\" src=\"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2021\/04\/Imagen5.png\" alt=\"A\u00f1adimos el paquete\u00a0NuGet\u00a0de\u00a0Moq\" width=\"567\" height=\"279\" srcset=\"https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2021\/04\/Imagen5.png 567w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2021\/04\/Imagen5-300x148.png 300w\" sizes=\"auto, (max-width: 567px) 100vw, 567px\" \/><p id=\"caption-attachment-1280\" class=\"wp-caption-text\">A\u00f1adimos el paquete\u00a0NuGet\u00a0de\u00a0Moq<\/p><\/div><\/p>\n<p><span data-contrast=\"auto\">Y a\u00f1adimos<\/span><span data-contrast=\"auto\">\u00a0las<\/span><span data-contrast=\"auto\">\u00a0<\/span><span data-contrast=\"auto\">referencias a nuestros otros proyectos para poder usar<\/span><span data-contrast=\"auto\">los<\/span><span data-contrast=\"auto\">\u00a0en\u00a0<\/span><span data-contrast=\"auto\">nuestros<\/span><span data-contrast=\"auto\">\u00a0<\/span><span data-contrast=\"auto\">tests<\/span><span data-contrast=\"auto\">.<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span><\/p>\n<p><div id=\"attachment_1281\" style=\"width: 577px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-1281\" class=\"wp-image-1281 size-full\" title=\"A\u00f1adimos referencias\" src=\"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2021\/04\/Imagen6.png\" alt=\"A\u00f1adimos referencias\" width=\"567\" height=\"395\" srcset=\"https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2021\/04\/Imagen6.png 567w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2021\/04\/Imagen6-300x209.png 300w\" sizes=\"auto, (max-width: 567px) 100vw, 567px\" \/><p id=\"caption-attachment-1281\" class=\"wp-caption-text\">A\u00f1adimos referencias<\/p><\/div><\/p>\n<p><span data-contrast=\"auto\">Ahora podemos eliminar la clase <\/span><span data-contrast=\"auto\">por defecto que nos viene en el proyecto y a\u00f1adir dos nuevas clases para testear nues<\/span><span data-contrast=\"auto\">tras dos\u00a0<\/span><span data-contrast=\"auto\">F<\/span><span data-contrast=\"auto\">unctions<\/span><span data-contrast=\"auto\">: \u201c<\/span><b><i><span data-contrast=\"auto\">GetBlobTests<\/span><\/i><\/b><span data-contrast=\"auto\">\u201d y \u201c<\/span><b><i><span data-contrast=\"auto\">GetBlobsListTests<\/span><\/i><\/b><span data-contrast=\"auto\">\u201d<\/span><span data-contrast=\"auto\">.<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span><\/p>\n<p><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span><\/p>\n<p><div id=\"attachment_1282\" style=\"width: 223px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-1282\" class=\"wp-image-1282 size-full\" title=\"\u201cGetBlobsListTests\u201d.\u00a0\" src=\"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2021\/04\/Imagen7.png\" alt=\"\u201cGetBlobsListTests\u201d.\u00a0\" width=\"213\" height=\"104\" \/><p id=\"caption-attachment-1282\" class=\"wp-caption-text\">A\u00f1adimos dos nuevas clases<\/p><\/div><\/p>\n<p><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span><\/p>\n<p><span data-contrast=\"auto\">Y,<\/span><span data-contrast=\"auto\">\u00a0por\u00a0<\/span><span data-contrast=\"auto\">\u00fa<\/span><span data-contrast=\"auto\">ltimo, vamos a a\u00f1adir u<\/span><span data-contrast=\"auto\">na<span style=\"color: #0000ff\">\u00a0<\/span><\/span><span style=\"color: #0000ff\"><a style=\"color: #0000ff\" href=\"https:\/\/docs.microsoft.com\/es-es\/azure\/azure-functions\/functions-test-a-function#create-test-classes\">factor\u00eda\u00a0de\u00a0tests<\/a><\/span><span data-contrast=\"auto\">,<\/span><span data-contrast=\"auto\">\u00a0para poder hacer comprobaciones sobre los logs que arrojan nuestras\u00a0<\/span><span data-contrast=\"auto\">F<\/span><span data-contrast=\"auto\">unctions<\/span><span data-contrast=\"auto\">\u00a0y\u00a0<\/span><span data-contrast=\"auto\">mockear<\/span><span data-contrast=\"auto\">\u00a0<\/span><span data-contrast=\"auto\">requests<\/span><span data-contrast=\"auto\">\u00a0(<\/span><span data-contrast=\"auto\">ten\u00e9is el paso a paso\u00a0<\/span><span data-contrast=\"auto\">en la documentaci\u00f3n oficial de Microsoft y<\/span><span data-contrast=\"auto\">\u00a0el c\u00f3digo\u00a0<\/span><span data-contrast=\"auto\">ya a\u00f1adido\u00a0<\/span><span data-contrast=\"auto\">en el repositorio de ejemplo del art\u00edculo<\/span><span data-contrast=\"auto\">)<\/span><span data-contrast=\"auto\">.<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span><\/p>\n<p><div id=\"attachment_1283\" style=\"width: 221px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-1283\" class=\"wp-image-1283 size-full\" title=\"Factor\u00eda de test\" src=\"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2021\/04\/Imagen8.png\" alt=\"Factor\u00eda de test\" width=\"211\" height=\"145\" \/><p id=\"caption-attachment-1283\" class=\"wp-caption-text\">Factor\u00eda de test<\/p><\/div><\/p>\n<p><span data-contrast=\"auto\">Con todo esto<\/span><span data-contrast=\"auto\">\u00a0ya estamos listos para escribir nuestros\u00a0<\/span><span data-contrast=\"auto\">tests<\/span><span data-contrast=\"auto\">\u00a0y pasar a la rama \u201cstep-1-writtingTests\u201d<\/span><span data-contrast=\"auto\">.<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span><\/p>\n<h2><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span><span data-contrast=\"auto\">HttpTrigger<\/span><span data-contrast=\"auto\">\u00a0<\/span><span data-contrast=\"auto\">function<\/span><span data-contrast=\"auto\">\u00a0<\/span><span data-contrast=\"auto\">tests<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span><\/h2>\n<p>using Azure.Storage.Blobs;<br \/>\nusing Microsoft.AspNetCore.Mvc;<br \/>\nusing Moq;<br \/>\nusing System;<br \/>\nusing System.Collections.Generic;<br \/>\nusing System.Threading.Tasks;<br \/>\nusing System.Linq;<br \/>\nusing TestingAzureFunctions.Fnt.Functions;<br \/>\nusing TestingAzureFunctions.Services.Abstract;<br \/>\nusing Xunit;<\/p>\n<p>namespace TestingAzureFunctions.Tests<br \/>\n{<\/p>\n<p style=\"padding-left: 40px\">public class GetBlobsListTests<br \/>\n{<\/p>\n<p style=\"padding-left: 80px\">[Fact]<br \/>\npublic async Task GetBlobsList_withData_returnArrayOfBlobNames()<br \/>\n{<\/p>\n<p style=\"padding-left: 120px\">var listLogger = (ListLogger)TestFactory.CreateLogger(LoggerTypes.List);<br \/>\nvar req = TestFactory.CreateHttpRequest(\u00abmockRequest\u00bb, \u00abmockRequest\u00bb);<br \/>\nvar mockBlobService = GetMockBlobService(true);<br \/>\nvar fnt = new GetBlobsList(mockBlobService);<\/p>\n<p style=\"padding-left: 120px\">var response = (OkObjectResult)await fnt.Run(req, listLogger);<\/p>\n<p style=\"padding-left: 120px\">string[] blobNames = response.Value as string[];<br \/>\nAssert.NotNull(response);<br \/>\nAssert.Equal(200, response.StatusCode);<br \/>\nAssert.NotEmpty(blobNames);<br \/>\nAssert.Equal(5, blobNames.Length);<br \/>\nAssert.Contains(\u00abBlob list retieved with 5 blob names\u00bb, listLogger.Logs[2]);<\/p>\n<p style=\"padding-left: 80px\">}<\/p>\n<p style=\"padding-left: 80px\">[Fact]<br \/>\npublic async Task GetBlobsList_withoutData_returnEmptyArray()<br \/>\n{<\/p>\n<p style=\"padding-left: 120px\">var listLogger = (ListLogger)TestFactory.CreateLogger(LoggerTypes.List);<br \/>\nvar req = TestFactory.CreateHttpRequest(\u00abmockRequest\u00bb, \u00abmockRequest\u00bb);<br \/>\nvar mockBlobService = GetMockBlobService(false);<br \/>\nvar fnt = new GetBlobsList(mockBlobService);<\/p>\n<p style=\"padding-left: 120px\">var response = (OkObjectResult)await fnt.Run(req, listLogger);<\/p>\n<p style=\"padding-left: 120px\">string[] blobNames = response.Value as string[];<br \/>\nAssert.NotNull(response);<br \/>\nAssert.Equal(200, response.StatusCode);<br \/>\nAssert.Empty(blobNames);<br \/>\nAssert.Contains(\u00abThere are no blobs in this container\u00bb, listLogger.Logs[2]);<\/p>\n<p style=\"padding-left: 80px\">}<\/p>\n<p style=\"padding-left: 80px\">[Fact]<br \/>\npublic async Task GetBlobsList_raiseException_returnExceptionResult()<br \/>\n{<\/p>\n<p style=\"padding-left: 120px\">var listLogger = (ListLogger)TestFactory.CreateLogger(LoggerTypes.List);<br \/>\nvar req = TestFactory.CreateHttpRequest(\u00abmockRequest\u00bb, \u00abmockRequest\u00bb);<br \/>\nvar mockBlobService = new Mock&lt;IBlobStorageService&gt;();<br \/>\nmockBlobService.Setup(x =&gt; x.GetBlobsListAsync(It.IsAny&lt;BlobContainerClient&gt;())).Throws(new Exception());<br \/>\nvar fnt = new GetBlobsList(mockBlobService.Object);<\/p>\n<p style=\"padding-left: 120px\">var response = await fnt.Run(req, listLogger);<\/p>\n<p style=\"padding-left: 120px\">Assert.Contains(\u00abError getting the blob list\u00bb, listLogger.Logs.Last());<\/p>\n<p style=\"padding-left: 80px\">}<\/p>\n<p style=\"padding-left: 80px\">#region Private methods<\/p>\n<p style=\"padding-left: 80px\">private IBlobStorageService GetMockBlobService(bool withData)<br \/>\n{<\/p>\n<p style=\"padding-left: 120px\">var mockBlobService = new Mock&lt;IBlobStorageService&gt;();<br \/>\nmockBlobService.Setup(x =&gt; x.GetBlobsListAsync(It.IsAny&lt;BlobContainerClient&gt;())).Returns(Task.FromResult(GetMockBlobList(withData)));<br \/>\nreturn mockBlobService.Object;<\/p>\n<p style=\"padding-left: 80px\">}<\/p>\n<p style=\"padding-left: 80px\">private List&lt;string&gt; GetMockBlobList(bool withData)<br \/>\n{<\/p>\n<p style=\"padding-left: 120px\">List&lt;string&gt; blobList = new List&lt;string&gt;();<br \/>\nif (withData)<br \/>\n{<\/p>\n<p style=\"padding-left: 160px\">blobList.Add(\u00abdoc1.txt\u00bb);<br \/>\nblobList.Add(\u00abdoc2.txt\u00bb);<br \/>\nblobList.Add(\u00abdoc3.txt\u00bb);<br \/>\nblobList.Add(\u00abdoc4.txt\u00bb);<br \/>\nblobList.Add(\u00abdoc5.txt\u00bb);<\/p>\n<p style=\"padding-left: 120px\">}<\/p>\n<p style=\"padding-left: 120px\">return blobList;<\/p>\n<p style=\"padding-left: 120px\">}<\/p>\n<p style=\"padding-left: 80px\">#endregion<\/p>\n<p style=\"padding-left: 40px\">}<\/p>\n<p>}<span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span><\/p>\n<p><span data-contrast=\"auto\">Para\u00a0<\/span><span data-contrast=\"auto\">hacer nuestros test<\/span><span data-contrast=\"auto\">\u00a0necesitamos un m\u00e9todo que nos devuelve una lista de nombres<\/span><span data-contrast=\"auto\">\u00a0de blobs<\/span><span data-contrast=\"auto\">\u00a0\u201c<\/span><b><i><span data-contrast=\"auto\">GetMockBlo<\/span><\/i><\/b><b><i><span data-contrast=\"auto\">b<\/span><\/i><\/b><b><i><span data-contrast=\"auto\">List<\/span><\/i><\/b><span data-contrast=\"auto\">\u201d, y un m\u00e9todo que nos prepare un\u00a0<\/span><span data-contrast=\"auto\">mock<\/span><span data-contrast=\"auto\">\u00a0de<\/span><span data-contrast=\"auto\">\u00a0nuestro\u00a0<\/span><span data-contrast=\"auto\">IBlobStorageService<\/span><span data-contrast=\"auto\">\u00a0\u201c<\/span><b><i><span data-contrast=\"auto\">GetMockBlobService<\/span><\/i><\/b><span data-contrast=\"auto\">\u201d, para poder\u00a0<\/span><span data-contrast=\"auto\">probar todos los casos de nuestros\u00a0<\/span><span data-contrast=\"auto\">tests<\/span><span data-contrast=\"auto\">.<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span><\/p>\n<p><span data-contrast=\"auto\">Ahora ya podemos escribir los <\/span><span data-contrast=\"auto\">tests<\/span><span data-contrast=\"auto\">\u00a0de nuestra\u00a0<\/span><span data-contrast=\"auto\">function<\/span><span data-contrast=\"auto\">\u00a0\u201c<\/span><b><i><span data-contrast=\"auto\">GetBlobsList<\/span><\/i><\/b><span data-contrast=\"auto\">\u201d<\/span><span data-contrast=\"auto\">\u00a0y<\/span><span data-contrast=\"auto\"> probar tres casos:<\/span><\/p>\n<ol>\n<li><span data-contrast=\"auto\">C<\/span><span data-contrast=\"auto\">uando nos devuelve un array de datos<\/span><span data-contrast=\"auto\">\u00a0(<\/span><span data-contrast=\"auto\">GetBlobsList_withData_returnArrayOfBlobNames<\/span><span data-contrast=\"auto\">)<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span><\/li>\n<\/ol>\n<p><div id=\"attachment_1284\" style=\"width: 573px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-1284\" class=\"wp-image-1284 size-full\" title=\"Nos devuelcve un array de datos\u00a0(GetBlobsList_withData_returnArrayOfBlobNames)\u00a0\" src=\"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2021\/04\/Imagen9.png\" alt=\"Nos devuelcve un array de datos\u00a0(GetBlobsList_withData_returnArrayOfBlobNames)\u00a0\" width=\"563\" height=\"288\" srcset=\"https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2021\/04\/Imagen9.png 563w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2021\/04\/Imagen9-300x153.png 300w\" sizes=\"auto, (max-width: 563px) 100vw, 563px\" \/><p id=\"caption-attachment-1284\" class=\"wp-caption-text\">Nos devuelve un array de datos (GetBlobsList_withData_returnArrayOfBlobNames)<\/p><\/div><\/p>\n<p style=\"padding-left: 40px\"><span data-contrast=\"auto\">2.C<\/span><span data-contrast=\"auto\">uando no nos devuelve datos<\/span><span data-contrast=\"auto\">\u00a0(<\/span><span data-contrast=\"auto\">GetBlobsList_withoutData_returnEmptyArray<\/span><span data-contrast=\"auto\">)<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span><\/p>\n<p><div id=\"attachment_1285\" style=\"width: 573px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-1285\" class=\"wp-image-1285 size-full\" title=\"No nos devuelve datos\u00a0(GetBlobsList_withoutData_returnEmptyArray)\u00a0\" src=\"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2021\/04\/Imagen10.png\" alt=\"No nos devuelve datos\u00a0(GetBlobsList_withoutData_returnEmptyArray)\u00a0\" width=\"563\" height=\"273\" srcset=\"https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2021\/04\/Imagen10.png 563w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2021\/04\/Imagen10-300x145.png 300w\" sizes=\"auto, (max-width: 563px) 100vw, 563px\" \/><p id=\"caption-attachment-1285\" class=\"wp-caption-text\">No nos devuelve datos\u00a0(GetBlobsList_withoutData_returnEmptyArray)<\/p><\/div><\/p>\n<p style=\"padding-left: 40px\">3. Cuando nos salta una excepci\u00f3n (GetBlobsList_raiseException_returnExceptionResult)<\/p>\n<p><div id=\"attachment_1286\" style=\"width: 658px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-1286\" class=\"wp-image-1286 size-full\" title=\"Nos salta una excepci\u00f3n (GetBlobsList_raiseException_returnExceptionResult)\" src=\"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2021\/04\/Imagen11.png\" alt=\"Nos salta una excepci\u00f3n (GetBlobsList_raiseException_returnExceptionResult)\" width=\"648\" height=\"194\" srcset=\"https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2021\/04\/Imagen11.png 648w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2021\/04\/Imagen11-300x90.png 300w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2021\/04\/Imagen11-610x183.png 610w\" sizes=\"auto, (max-width: 648px) 100vw, 648px\" \/><p id=\"caption-attachment-1286\" class=\"wp-caption-text\">Nos salta una excepci\u00f3n (GetBlobsList_raiseException_returnExceptionResult)<\/p><\/div><\/p>\n<p>Para los nombres de los tests estamos siguiendo esta notaci\u00f3n:<\/p>\n<p>QueEstoyProbando_casoDePrueba_resultadoEsperado<\/p>\n<p>&nbsp;<\/p>\n<h2>TimeTrigger function tests<\/h2>\n<p>using Azure.Storage.Blobs.Models;<br \/>\nusing Moq;<br \/>\nusing System;<br \/>\nusing System.IO;<br \/>\nusing System.Linq;<br \/>\nusing System.Text;<br \/>\nusing System.Threading.Tasks;<br \/>\nusing TestingAzureFunctions.Fnt.Functions;<br \/>\nusing TestingAzureFunctions.Services.Abstract;<br \/>\nusing Xunit;<\/p>\n<p>namespace TestingAzureFunctions.Tests<br \/>\n{<\/p>\n<p style=\"padding-left: 40px\">public class GetBlobTests<br \/>\n{<\/p>\n<p style=\"padding-left: 80px\">[Fact]<br \/>\npublic async Task GetBlob_withData_logBlobContent()<br \/>\n{<\/p>\n<p style=\"padding-left: 120px\">var listLogger = (ListLogger)TestFactory.CreateLogger(LoggerTypes.List);<br \/>\nvar mockBlobService = new Mock();<br \/>\nmockBlobService.Setup(x =&gt; x.DownloadBlobAsync()).Returns(Task.FromResult(GetMockBlob()));<br \/>\nvar fnt = new GetBlob(mockBlobService.Object);<\/p>\n<p style=\"padding-left: 120px\">await fnt.Run(null, listLogger);<\/p>\n<p style=\"padding-left: 120px\">Assert.Contains(\u00abBlob content: doc\u00bb, listLogger.Logs[3]);<br \/>\nAssert.Contains(\u00abblob content readed successfully\u00bb, listLogger.Logs.Last());<\/p>\n<p style=\"padding-left: 80px\">}<\/p>\n<p style=\"padding-left: 80px\">[Fact]<br \/>\npublic async Task GetBlob_throwException_logError()<br \/>\n{<\/p>\n<p style=\"padding-left: 120px\">var listLogger = (ListLogger)TestFactory.CreateLogger(LoggerTypes.List);<br \/>\nvar mockBlobService = new Mock();<br \/>\nmockBlobService.Setup(x =&gt; x.DownloadBlobAsync()).Throws(new Exception());<br \/>\nvar fnt = new GetBlob(mockBlobService.Object);<\/p>\n<p style=\"padding-left: 120px\">await fnt.Run(null, listLogger);<\/p>\n<p style=\"padding-left: 120px\">Assert.Contains(\u00abError getting the blob\u00bb, listLogger.Logs.Last());<\/p>\n<p style=\"padding-left: 80px\">}<\/p>\n<p style=\"padding-left: 80px\">#region Private methods<\/p>\n<p style=\"padding-left: 80px\">private BlobDownloadInfo GetMockBlob()<br \/>\n{<\/p>\n<p style=\"padding-left: 120px\">byte[] firstString = Encoding.UTF8.GetBytes(\u00abdoc\u00bb);<br \/>\nMemoryStream str = new MemoryStream(firstString);<\/p>\n<p style=\"padding-left: 120px\">BlobDownloadInfo blob = BlobsModelFactory.BlobDownloadInfo(<br \/>\nDateTime.UtcNow, 0, BlobType.Block, null, null, null, null, null, null,<br \/>\nCopyStatus.Pending, null, LeaseDurationType.Infinite, null, LeaseState.Available,<br \/>\nnull, LeaseStatus.Locked, null, null, default, 0, null, false, null, null,<br \/>\nnull, 0, null, null, null, str);<br \/>\nreturn blob;<\/p>\n<p style=\"padding-left: 80px\">}<\/p>\n<p style=\"padding-left: 80px\">#endregion<\/p>\n<p style=\"padding-left: 40px\">}<\/p>\n<p>}<\/p>\n<p>Para hacer los tests de la function \u201c<strong><em>GetBlob<\/em><\/strong>\u201d nos vamos a servir de otro m\u00e9todo \u201c<strong><em>GetMockBlob<\/em><\/strong>\u201d que nos devuelva un objeto \u201c<strong><em>BlobDownloadInfo<\/em><\/strong>\u201d para alimentar a nuestro \u201c<strong><em>IBlobStorageService<\/em><\/strong>\u201d mockeado.<\/p>\n<p>Y podemos probar los siguientes casos:<\/p>\n<ol>\n<li>Cuando se tracea correctamente el contenido del blob (GetBlob_withData_logBlobContent)<\/li>\n<\/ol>\n<p><div id=\"attachment_1287\" style=\"width: 577px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-1287\" class=\"wp-image-1287 size-full\" title=\"Cuando se tracea correctamente el contenido del blob\" src=\"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2021\/04\/Imagen12.png\" alt=\"Cuando se tracea correctamente el contenido del blob\" width=\"567\" height=\"193\" srcset=\"https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2021\/04\/Imagen12.png 567w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2021\/04\/Imagen12-300x102.png 300w\" sizes=\"auto, (max-width: 567px) 100vw, 567px\" \/><p id=\"caption-attachment-1287\" class=\"wp-caption-text\">Cuando se tracea correctamente el contenido del blob<\/p><\/div><\/p>\n<p style=\"padding-left: 40px\">2. Cuando nos salta una excepci\u00f3n (GetBlob_throwException_logError)<\/p>\n<p><div id=\"attachment_1288\" style=\"width: 566px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-1288\" class=\"wp-image-1288 size-full\" title=\"Cuando nos salta una excepci\u00f3n (GetBlob_throwException_logError)\" src=\"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2021\/04\/Imagen13.png\" alt=\"Cuando nos salta una excepci\u00f3n (GetBlob_throwException_logError)\" width=\"556\" height=\"216\" srcset=\"https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2021\/04\/Imagen13.png 556w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2021\/04\/Imagen13-300x117.png 300w\" sizes=\"auto, (max-width: 556px) 100vw, 556px\" \/><p id=\"caption-attachment-1288\" class=\"wp-caption-text\">Cuando nos salta una excepci\u00f3n (GetBlob_throwException_logError)<\/p><\/div><\/p>\n<h2>Conclusiones<\/h2>\n<p>Ya hemos visto c\u00f3mo podemos hacer test unitarios para asegurar que nuestro c\u00f3digo est\u00e1 protegido contra regresiones y funciona correctamente.<\/p>\n<p>Hemos a\u00f1adido una factor\u00eda de tests que nos ayuda a la hora de escribir nuestras pruebas.<\/p>\n<p>Nos hemos valido de <strong>Moq <\/strong>para emular los casos espec\u00edficos por los que pasa nuestro flujo de ejecuci\u00f3n.<\/p>\n<p>Y hemos comprobado que, en cada caso que se puede dar a lo largo de la ejecuci\u00f3n de nuestras Azure Functions, el c\u00f3digo se comporta exactamente como deseamos.<\/p>\n<p>El c\u00f3digo final est\u00e1 en la rama \u201cstep-2-finish\u201d del repositorio, para que pod\u00e1is consultar el resultado final, y ahora solo nos queda echar el respaldo de la silla para atr\u00e1s y disfrutar de la maravillosa vista de todos nuestros test pasando con toda la lista en verde \ud83d\ude09<\/p>\n<p><div id=\"attachment_1289\" style=\"width: 416px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-1289\" class=\"wp-image-1289 size-full\" title=\"Maravillosa vista de ver todos nuestros test pasando con toda la lista en verde\" src=\"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2021\/04\/Imagen14.png\" alt=\"Maravillosa vista de ver todos nuestros test pasando con toda la lista en verde\" width=\"406\" height=\"301\" srcset=\"https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2021\/04\/Imagen14.png 406w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2021\/04\/Imagen14-300x222.png 300w\" sizes=\"auto, (max-width: 406px) 100vw, 406px\" \/><p id=\"caption-attachment-1289\" class=\"wp-caption-text\">Maravillosa vista de todos nuestros test pasando con toda la lista en verde<\/p><\/div><\/p>\n<!-- AddThis Advanced Settings generic via filter on the_content --><!-- AddThis Share Buttons generic via filter on the_content --><span class=\"et_bloom_bottom_trigger\"><\/span>","protected":false},"excerpt":{"rendered":"<p>Azure\u00a0Functions\u00a0pone a nuestra disposici\u00f3n una forma maravillosa de ejecutar tareas de forma\u00a0manual o\u00a0desatendida en un entorno cloud\u00a0y\u00a0serverless.\u00a0Podemos\u00a0programar tareas de todo tipo en respuesta a multitud de eventos, ya sea una llamada Http, un temporizador\u00a0o\u00a0la subida\u00a0de un documento a un\u00a0storage, por &hellip; <a href=\"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/testeando-nuestras-azure-functions\/\">Continue reading <span class=\"meta-nav\">&rarr;<\/span><\/a><!-- AddThis Advanced Settings generic via filter on get_the_excerpt --><!-- AddThis Share Buttons generic via filter on get_the_excerpt --><\/p>\n","protected":false},"author":193,"featured_media":1295,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[111],"tags":[8,114,119],"class_list":["post-1274","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-azure-functions","tag-azure","tag-azure-functions","tag-blobs"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v18.2.1 (Yoast SEO v27.3) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Testeando nuestras Azure Functions | ENCAMINA<\/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:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/testeando-nuestras-azure-functions\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Testeando nuestras Azure Functions\" \/>\n<meta property=\"og:description\" content=\"Azure\u00a0Functions\u00a0pone a nuestra disposici\u00f3n una forma maravillosa de ejecutar tareas de forma\u00a0manual o\u00a0desatendida en un entorno cloud\u00a0y\u00a0serverless.\u00a0Podemos\u00a0programar tareas de todo tipo en respuesta a multitud de eventos, ya sea una llamada Http, un temporizador\u00a0o\u00a0la subida\u00a0de un documento a un\u00a0storage, por &hellip; Continue reading &rarr;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/testeando-nuestras-azure-functions\/\" \/>\n<meta property=\"og:site_name\" content=\"Piensa en software, desarrolla en colores\" \/>\n<meta property=\"article:published_time\" content=\"2021-04-22T16:52:39+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2021-04-27T09:36:28+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2021\/04\/testeando-functions.png\" \/>\n\t<meta property=\"og:image:width\" content=\"593\" \/>\n\t<meta property=\"og:image:height\" content=\"339\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Andr\u00e9s S\u00e1nchez Roble\u00f1o\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Andr\u00e9s S\u00e1nchez Roble\u00f1o\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data2\" content=\"9 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/testeando-nuestras-azure-functions\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/testeando-nuestras-azure-functions\\\/\"},\"author\":{\"name\":\"Andr\u00e9s S\u00e1nchez Roble\u00f1o\",\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/#\\\/schema\\\/person\\\/b4177badafd61061e939c45e3e2c6d72\"},\"headline\":\"Testeando nuestras Azure Functions\",\"datePublished\":\"2021-04-22T16:52:39+00:00\",\"dateModified\":\"2021-04-27T09:36:28+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/testeando-nuestras-azure-functions\\\/\"},\"wordCount\":1453,\"commentCount\":0,\"image\":{\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/testeando-nuestras-azure-functions\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/wp-content\\\/uploads\\\/sites\\\/21\\\/2021\\\/04\\\/testeando-functions.png\",\"keywords\":[\"Azure\",\"Azure Functions\",\"blobs\"],\"articleSection\":[\"Azure Functions\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/testeando-nuestras-azure-functions\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/testeando-nuestras-azure-functions\\\/\",\"url\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/testeando-nuestras-azure-functions\\\/\",\"name\":\"Testeando nuestras Azure Functions | ENCAMINA\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/testeando-nuestras-azure-functions\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/testeando-nuestras-azure-functions\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/wp-content\\\/uploads\\\/sites\\\/21\\\/2021\\\/04\\\/testeando-functions.png\",\"datePublished\":\"2021-04-22T16:52:39+00:00\",\"dateModified\":\"2021-04-27T09:36:28+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/#\\\/schema\\\/person\\\/b4177badafd61061e939c45e3e2c6d72\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/testeando-nuestras-azure-functions\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/testeando-nuestras-azure-functions\\\/#primaryimage\",\"url\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/wp-content\\\/uploads\\\/sites\\\/21\\\/2021\\\/04\\\/testeando-functions.png\",\"contentUrl\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/wp-content\\\/uploads\\\/sites\\\/21\\\/2021\\\/04\\\/testeando-functions.png\",\"width\":593,\"height\":339},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/#website\",\"url\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/\",\"name\":\"Piensa en software, desarrolla en colores\",\"description\":\"Las ventajas que te ofrece Microsoft Azure y el mundo.NET\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/#\\\/schema\\\/person\\\/b4177badafd61061e939c45e3e2c6d72\",\"name\":\"Andr\u00e9s S\u00e1nchez Roble\u00f1o\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/0bdd170031df5f8351199d72b038ebfc632f9ca40078f4246923b0ed5517d996?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/0bdd170031df5f8351199d72b038ebfc632f9ca40078f4246923b0ed5517d996?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/0bdd170031df5f8351199d72b038ebfc632f9ca40078f4246923b0ed5517d996?s=96&d=mm&r=g\",\"caption\":\"Andr\u00e9s S\u00e1nchez Roble\u00f1o\"},\"description\":\"T\u00e9cnico superior en desarrollo de aplicaciones web y Microsoft Certified Solutions Developer. Apasionado de las tecnolog\u00edas y de como usarlas para dar soluciones a problemas complejos. Disfruta de aprender cada d\u00eda algo nuevo y de aportar todo su valor en su actual puesto como Cloud Solutions Developer en ENCAMINA. Dando pasos de beb\u00e9 para luego poder dar pasos de gigante.\",\"url\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/author\\\/asanchez\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Testeando nuestras Azure Functions | ENCAMINA","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:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/testeando-nuestras-azure-functions\/","og_locale":"es_ES","og_type":"article","og_title":"Testeando nuestras Azure Functions","og_description":"Azure\u00a0Functions\u00a0pone a nuestra disposici\u00f3n una forma maravillosa de ejecutar tareas de forma\u00a0manual o\u00a0desatendida en un entorno cloud\u00a0y\u00a0serverless.\u00a0Podemos\u00a0programar tareas de todo tipo en respuesta a multitud de eventos, ya sea una llamada Http, un temporizador\u00a0o\u00a0la subida\u00a0de un documento a un\u00a0storage, por &hellip; Continue reading &rarr;","og_url":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/testeando-nuestras-azure-functions\/","og_site_name":"Piensa en software, desarrolla en colores","article_published_time":"2021-04-22T16:52:39+00:00","article_modified_time":"2021-04-27T09:36:28+00:00","og_image":[{"width":593,"height":339,"url":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2021\/04\/testeando-functions.png","type":"image\/png"}],"author":"Andr\u00e9s S\u00e1nchez Roble\u00f1o","twitter_card":"summary_large_image","twitter_misc":{"Escrito por":"Andr\u00e9s S\u00e1nchez Roble\u00f1o","Tiempo de lectura":"9 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/testeando-nuestras-azure-functions\/#article","isPartOf":{"@id":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/testeando-nuestras-azure-functions\/"},"author":{"name":"Andr\u00e9s S\u00e1nchez Roble\u00f1o","@id":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/#\/schema\/person\/b4177badafd61061e939c45e3e2c6d72"},"headline":"Testeando nuestras Azure Functions","datePublished":"2021-04-22T16:52:39+00:00","dateModified":"2021-04-27T09:36:28+00:00","mainEntityOfPage":{"@id":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/testeando-nuestras-azure-functions\/"},"wordCount":1453,"commentCount":0,"image":{"@id":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/testeando-nuestras-azure-functions\/#primaryimage"},"thumbnailUrl":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2021\/04\/testeando-functions.png","keywords":["Azure","Azure Functions","blobs"],"articleSection":["Azure Functions"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/testeando-nuestras-azure-functions\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/testeando-nuestras-azure-functions\/","url":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/testeando-nuestras-azure-functions\/","name":"Testeando nuestras Azure Functions | ENCAMINA","isPartOf":{"@id":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/#website"},"primaryImageOfPage":{"@id":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/testeando-nuestras-azure-functions\/#primaryimage"},"image":{"@id":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/testeando-nuestras-azure-functions\/#primaryimage"},"thumbnailUrl":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2021\/04\/testeando-functions.png","datePublished":"2021-04-22T16:52:39+00:00","dateModified":"2021-04-27T09:36:28+00:00","author":{"@id":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/#\/schema\/person\/b4177badafd61061e939c45e3e2c6d72"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/testeando-nuestras-azure-functions\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/testeando-nuestras-azure-functions\/#primaryimage","url":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2021\/04\/testeando-functions.png","contentUrl":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2021\/04\/testeando-functions.png","width":593,"height":339},{"@type":"WebSite","@id":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/#website","url":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/","name":"Piensa en software, desarrolla en colores","description":"Las ventajas que te ofrece Microsoft Azure y el mundo.NET","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Person","@id":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/#\/schema\/person\/b4177badafd61061e939c45e3e2c6d72","name":"Andr\u00e9s S\u00e1nchez Roble\u00f1o","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/secure.gravatar.com\/avatar\/0bdd170031df5f8351199d72b038ebfc632f9ca40078f4246923b0ed5517d996?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/0bdd170031df5f8351199d72b038ebfc632f9ca40078f4246923b0ed5517d996?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/0bdd170031df5f8351199d72b038ebfc632f9ca40078f4246923b0ed5517d996?s=96&d=mm&r=g","caption":"Andr\u00e9s S\u00e1nchez Roble\u00f1o"},"description":"T\u00e9cnico superior en desarrollo de aplicaciones web y Microsoft Certified Solutions Developer. Apasionado de las tecnolog\u00edas y de como usarlas para dar soluciones a problemas complejos. Disfruta de aprender cada d\u00eda algo nuevo y de aportar todo su valor en su actual puesto como Cloud Solutions Developer en ENCAMINA. Dando pasos de beb\u00e9 para luego poder dar pasos de gigante.","url":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/author\/asanchez\/"}]}},"_links":{"self":[{"href":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-json\/wp\/v2\/posts\/1274","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-json\/wp\/v2\/users\/193"}],"replies":[{"embeddable":true,"href":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-json\/wp\/v2\/comments?post=1274"}],"version-history":[{"count":0,"href":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-json\/wp\/v2\/posts\/1274\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-json\/wp\/v2\/media\/1295"}],"wp:attachment":[{"href":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-json\/wp\/v2\/media?parent=1274"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-json\/wp\/v2\/categories?post=1274"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-json\/wp\/v2\/tags?post=1274"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}