<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Marta Rey</title>
    <description>The latest articles on DEV Community by Marta Rey (@martreyz).</description>
    <link>https://dev.to/martreyz</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F610612%2F83c2aefa-3009-4745-85c3-519d1fd17c7e.jpeg</url>
      <title>DEV Community: Marta Rey</title>
      <link>https://dev.to/martreyz</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/martreyz"/>
    <language>en</language>
    <item>
      <title>Snippets VSCode: Rapidito y con buena letra.</title>
      <dc:creator>Marta Rey</dc:creator>
      <pubDate>Wed, 29 Dec 2021 13:20:26 +0000</pubDate>
      <link>https://dev.to/martreyz/snippets-vscode-rapidito-y-con-buena-letra-1ge0</link>
      <guid>https://dev.to/martreyz/snippets-vscode-rapidito-y-con-buena-letra-1ge0</guid>
      <description>&lt;p&gt;Hace menos de un mes fue mi primer aniversario como programadora Front End, o hizo un año que acabé el bootcamp... Como quieras verlo. El tema de poner fechas de aniversarios ya se sabe... siempre hay discordia y no se sabe muy bien desde qué punto empezar a contar, pero a mí me gusta escoger un día de referencia siempre para todo, y repasar días mentalmente de vez en cuando para ir memorizando poco a poco un montón de fechas! (ya, no estoy bien, pero tampoco hago daño a nadie).&lt;/p&gt;

&lt;p&gt;Total, que me he dado cuenta de que durante este año así a lo tonto he conocido a un montón de personas que programan (entre cursos y proyectitos y trabajo y chacharetas así en general...) y creo que a estas alturas tengo suficiente información para aseverar que en desarrollo cada persona tiene su súper poder: están las Súper Detallistas (que enganchan una docu y la exprimen hasta el último punto y coma), las Súper Recordadoras (que no necesitaría fechas en los commits porque sabe siempre qué se hizo dónde y por qué), las Súper Resolutivas (que siempre tienen un pseudo-elemento en la manga),... Y yo creo que ya veis por donde voy. Pues bien, yo creo que soy un poco de las Súper Rapiditas (que a priori parece que muy bien pero luego tienes un día un poco tonto y escribes cosas como “error.massage” y te quedas tan ancha y luego no sabes qué pasa y todo mal). Y es que al final todo gran poder conlleva una gran responsabilidad, y yo creo que la de cada Súper Dev es tranquilizar un poquito sus instintos e intentar encontrar el equilibrio perfecto.&lt;/p&gt;

&lt;p&gt;Vamos, que si tienes muchísima atención por el detalle está genial, pero tienes que intentar no perderte en tus lecturas e investigaciones, y si tienes muchos recursos tienes que intentar no acabar haciendo un código que solo tú entiendes... y si a veces se te va un poquito la mano con las prisas tienes que intentar hacer las cosas con más calma y centrarte más en el detalle. O así lo veo yo, que al final es lo que viene a cuento que para eso estoy escribiendo yo (como con la radio del coche el que conduce).&lt;/p&gt;

&lt;p&gt;En definitiva! A ver si me centro que no me centro. Que hace unos meses que estoy muy interesada en herramientas que me ayuden a eso, a afinar mejor, sea como sea la ayuda: el linter, por ejemplo, me ayuda porque me enseña mis errores en el momento y me obliga a parar a revisar, los tests me ayudan porque me obligan a refactorizar mi código para facilitar la tarea, y por tanto a revisar el código tal y como termino de escribirlo... (tengo algunos truquillos caseros también, por qué no decirlo). Pero hay una en concreto que nunca hubiera dicho que me fuera a ayudar, y resulta ser que sí, y son los Snippets de código.&lt;/p&gt;

&lt;p&gt;Y estarás pensando “Amiga, los snippets de código no te ayudan a escribir mejor código, escriben código por ti” y sí, efectivamente, pero a la vez no, porque el código que escriben los snippets es la “paja”, el código repetitivo. Y esto me lleva a los motivos por los que en efecto, me ayuda:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Como decía, los snippets sirven para “automatizar” la escritura de código repetitivo, donde los errores suelen ser: “no he visto que me faltaba un corchete”, “no he visto que me faltaba ese paréntesis” o “ostras, la coma”. Es decir, no es que pienses que la flecha de una arrow function se escribe así &lt;code&gt;=&amp;lt;&lt;/code&gt;  , es que estabas mojando la galleta en el colacao y has soltado el shift antes de tiempo, y evitar esos errores evita mucha frustración y deja muy limpita la cabeza para pensar y razonar.&lt;/li&gt;
&lt;li&gt;Al automatizar esas construcciones dedico menos tiempo a pensar en tareas repetitivas y dedico tiempo de calidad al resto del código.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;En fin, que los Snippets son mis nuevos mejores amigos. &lt;/p&gt;

&lt;p&gt;Crear un snippet es muy sencillo, al menos en VS Code (y me da a mí por pensar que en todos los IDE será igual de fácil): únicamente tenemos que hacer click en settings y seleccionar “User Snippets”:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--TenaQyx2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vb5dbc6wl9csknph43m1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--TenaQyx2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vb5dbc6wl9csknph43m1.png" alt='Captura de imagen de las opciones de "settings" del VS Code, en donde se lee, por este orden: command palette, settings, online services settings, extensions, keyboard shortcuts, migrate keyboard shortcuts from..., user snippets, color theme, file icon theme, product icon theme, turn on settings sync, manage workplace trust y restart to update' width="496" height="561"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Se abrirá arriba un cuadro de opciones de la que elegiremos la que más nos convenga (si es la primera vez tendrás que crear un nuevo archivo global como se indica en la imagen, en caso contrario puedes elegir de la lista de los archivos existentes el que quieres modificar:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--mxnvoJIC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bx2hqftn9kfw8rccxegc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--mxnvoJIC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bx2hqftn9kfw8rccxegc.png" alt='Pantallazo con un cuadro de opciones donde aparecen primero los archivos html.code-snippets, snippets.code-snippets y javascript.json; y a continuación la opción destacada de "New Global snippets file..."' width="875" height="164"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;También nos da la opción de configurar los snippets a nivel proyecto.&lt;/p&gt;

&lt;p&gt;Una vez seleccionada la opción (si hemos elegido crear un nuevo archivo nos preguntará el nombre que le queremos dar), accederemos al archivo .json donde configuraremos nuestros snippets siguiendo la siguiente estructura:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Nombre del snippet&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;scope&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;El&lt;/span&gt; &lt;span class="nx"&gt;ámbito&lt;/span&gt; &lt;span class="nx"&gt;al&lt;/span&gt; &lt;span class="nx"&gt;que&lt;/span&gt; &lt;span class="nx"&gt;pertenece&lt;/span&gt; &lt;span class="nx"&gt;el&lt;/span&gt; &lt;span class="nx"&gt;snippet&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;para&lt;/span&gt; &lt;span class="nx"&gt;que&lt;/span&gt; &lt;span class="nx"&gt;se&lt;/span&gt; &lt;span class="nx"&gt;muestren&lt;/span&gt; &lt;span class="nx"&gt;únicamente&lt;/span&gt; &lt;span class="nx"&gt;los&lt;/span&gt; &lt;span class="nx"&gt;relevantes&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="nx"&gt;cada&lt;/span&gt; &lt;span class="nx"&gt;caso&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt; &lt;span class="nx"&gt;Pueden&lt;/span&gt; &lt;span class="nx"&gt;ser&lt;/span&gt; &lt;span class="nx"&gt;lenguajes&lt;/span&gt; &lt;span class="nx"&gt;o&lt;/span&gt; 
&lt;span class="nx"&gt;proyectos&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;prefix&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;La&lt;/span&gt; &lt;span class="nx"&gt;palabra&lt;/span&gt; &lt;span class="nx"&gt;con&lt;/span&gt; &lt;span class="nx"&gt;la&lt;/span&gt; &lt;span class="nx"&gt;que&lt;/span&gt; &lt;span class="nx"&gt;llamaremos&lt;/span&gt; &lt;span class="nx"&gt;al&lt;/span&gt; &lt;span class="nx"&gt;snippet&lt;/span&gt; &lt;span class="nx"&gt;desde&lt;/span&gt; &lt;span class="nx"&gt;el&lt;/span&gt; &lt;span class="nx"&gt;código&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;body&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="nx"&gt;Una&lt;/span&gt; &lt;span class="nx"&gt;o&lt;/span&gt; &lt;span class="nx"&gt;varias&lt;/span&gt; &lt;span class="nx"&gt;líneas&lt;/span&gt; &lt;span class="nx"&gt;de&lt;/span&gt; &lt;span class="nx"&gt;código&lt;/span&gt; &lt;span class="nx"&gt;que&lt;/span&gt; &lt;span class="nx"&gt;queremos&lt;/span&gt; &lt;span class="nx"&gt;que&lt;/span&gt; &lt;span class="nx"&gt;se&lt;/span&gt; &lt;span class="nx"&gt;inserte&lt;/span&gt; &lt;span class="nx"&gt;de&lt;/span&gt; &lt;span class="nx"&gt;forma&lt;/span&gt; &lt;span class="nx"&gt;automática&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="nx"&gt;Tiene&lt;/span&gt; &lt;span class="nx"&gt;formato&lt;/span&gt; &lt;span class="nx"&gt;array&lt;/span&gt; &lt;span class="nx"&gt;de&lt;/span&gt; &lt;span class="nx"&gt;strings&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;donde&lt;/span&gt; &lt;span class="nx"&gt;cada&lt;/span&gt;
&lt;span class="nx"&gt;string&lt;/span&gt; &lt;span class="nx"&gt;es&lt;/span&gt; &lt;span class="nx"&gt;una&lt;/span&gt; &lt;span class="nx"&gt;línea&lt;/span&gt; &lt;span class="nx"&gt;de&lt;/span&gt; &lt;span class="nx"&gt;código&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="nx"&gt;En&lt;/span&gt; &lt;span class="nx"&gt;el&lt;/span&gt; &lt;span class="nx"&gt;ejemplo&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="nx"&gt;continuación&lt;/span&gt; &lt;span class="nx"&gt;se&lt;/span&gt; &lt;span class="nx"&gt;insertaría&lt;/span&gt; &lt;span class="nx"&gt;un&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt; &lt;span class="nx"&gt;de&lt;/span&gt; &lt;span class="nx"&gt;un&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;el&lt;/span&gt; &lt;span class="nx"&gt;$1&lt;/span&gt; &lt;span class="nx"&gt;indica&lt;/span&gt; &lt;span class="nx"&gt;que&lt;/span&gt; &lt;span class="nx"&gt;el&lt;/span&gt; &lt;span class="nx"&gt;cursor&lt;/span&gt; &lt;span class="nx"&gt;se&lt;/span&gt; 
&lt;span class="nx"&gt;posicionará&lt;/span&gt; &lt;span class="nx"&gt;en&lt;/span&gt; &lt;span class="nx"&gt;ese&lt;/span&gt; &lt;span class="nx"&gt;punto&lt;/span&gt; &lt;span class="nx"&gt;en&lt;/span&gt; &lt;span class="nx"&gt;primera&lt;/span&gt; &lt;span class="nx"&gt;instancia&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;y&lt;/span&gt; &lt;span class="nx"&gt;el&lt;/span&gt; &lt;span class="nx"&gt;$2&lt;/span&gt; &lt;span class="nx"&gt;será&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="nx"&gt;donde&lt;/span&gt; &lt;span class="nx"&gt;iremos&lt;/span&gt; &lt;span class="nx"&gt;haciendo&lt;/span&gt; &lt;span class="nx"&gt;el&lt;/span&gt; &lt;span class="nx"&gt;primer&lt;/span&gt; &lt;span class="nx"&gt;tab&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="nx"&gt;De&lt;/span&gt; &lt;span class="nx"&gt;esta&lt;/span&gt; &lt;span class="nx"&gt;forma&lt;/span&gt; &lt;span class="nx"&gt;al&lt;/span&gt; &lt;span class="nx"&gt;meter&lt;/span&gt; &lt;span class="nx"&gt;el&lt;/span&gt; &lt;span class="nx"&gt;snippet&lt;/span&gt; &lt;span class="nx"&gt;nos&lt;/span&gt; 
&lt;span class="nx"&gt;situará&lt;/span&gt; &lt;span class="nx"&gt;automáticamente&lt;/span&gt; &lt;span class="nx"&gt;en&lt;/span&gt; &lt;span class="nx"&gt;el&lt;/span&gt; &lt;span class="nx"&gt;punto&lt;/span&gt; &lt;span class="nx"&gt;donde&lt;/span&gt; &lt;span class="nx"&gt;incluir&lt;/span&gt; &lt;span class="nx"&gt;la&lt;/span&gt; &lt;span class="nx"&gt;variable&lt;/span&gt; &lt;span class="nx"&gt;del&lt;/span&gt; &lt;span class="nx"&gt;mismo&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;la&lt;/span&gt; &lt;span class="nx"&gt;palabra&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="nx"&gt;consolear&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;console.log('$1');&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;$2&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;description&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Descripción&lt;/span&gt; &lt;span class="nx"&gt;opcional&lt;/span&gt; &lt;span class="nx"&gt;para&lt;/span&gt; &lt;span class="nx"&gt;mostrar&lt;/span&gt; &lt;span class="nx"&gt;cuando&lt;/span&gt; &lt;span class="nx"&gt;se&lt;/span&gt; &lt;span class="nx"&gt;introduzca&lt;/span&gt; &lt;span class="nx"&gt;el&lt;/span&gt; &lt;span class="nx"&gt;prefix&lt;/span&gt; &lt;span class="nx"&gt;en&lt;/span&gt; &lt;span class="nx"&gt;el&lt;/span&gt; &lt;span class="nx"&gt;código&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;para&lt;/span&gt; &lt;span class="nx"&gt;identificar&lt;/span&gt; &lt;span class="nx"&gt;la&lt;/span&gt; &lt;span class="nx"&gt;utilidad&lt;/span&gt; &lt;span class="nx"&gt;de&lt;/span&gt; &lt;span class="nx"&gt;cada&lt;/span&gt; &lt;span class="nx"&gt;uno&lt;/span&gt; 
&lt;span class="nx"&gt;de&lt;/span&gt; &lt;span class="nx"&gt;los&lt;/span&gt; &lt;span class="nx"&gt;snippets&lt;/span&gt; &lt;span class="nx"&gt;que&lt;/span&gt; &lt;span class="nx"&gt;se&lt;/span&gt; &lt;span class="nx"&gt;muestran&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
 &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si es la primera vez que oyes hablar de los snippets seguramente ahora mismo estés pensando la cantidad de estructuras que vas a crear y lo bonita que va a ser tu vida a partir de ahora, pero espera, porque todavía no conoces toda tu suerte.&lt;/p&gt;

&lt;p&gt;Resulta que esa es la opción “difícil”, la de súper pro, la de “se me ha ocurrido una cosa que no se le ha ocurrido a nadie antes y que no se le ocurre más que a un genio” (yo todavía no he tenido que crear ninguno, así un poco para probarlo y tal... poco más). Para lo que es el día a día, para empezar a usarlo ya mismo, no he tenido que montar ni un snippet porque como suele ocurrir en este mundillo... ya lo ha hecho alguien.&lt;/p&gt;

&lt;p&gt;Y es que, a parte de los Snippets que trae el propio &lt;a href="https://code.visualstudio.com/docs/editor/userdefinedsnippets"&gt;VS Code&lt;/a&gt; (se consultan haciendo ctrl+shift+p para abrir la Paleta de Comandos y seleccionando “Insert Snippet”), existen un montón de extensiones del marketplace que te proveen con un montón dependiendo del lenguaje que quieras que sea SNIPPEADO (es tarde ya y empiezo a perder un poco el pie):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://marketplace.visualstudio.com/items?itemName=MadsKristensen.JavaScriptSnippetPack"&gt;JavaScript Snippet Pack&lt;/a&gt;:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--V6t0J8m4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rinfhd3efg9b0qjv4o2p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--V6t0J8m4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rinfhd3efg9b0qjv4o2p.png" alt="Imagen de referencia de la extensión JavaScript Snippet Pack en el marketplace de VS Code, donde se puede leer que está creada por Mahmoud Ali, tiene 421.599 descargas y 5/5 estrellas de 12 reviews." width="839" height="212"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://marketplace.visualstudio.com/items?itemName=abusaidm.html-snippets"&gt;HTML Snippets&lt;/a&gt;:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--2aJL8Yrw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gkri8aesx66csc1n8xet.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--2aJL8Yrw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gkri8aesx66csc1n8xet.png" alt="Imagen de referencia de la extensión HTML Snippets en el marketplace de VS Code, donde se puede leer que está creada por Mohamed Abusaid, tiene 6.663.411 descargas y 4.5/5 estrellas de 62 reviews." width="768" height="209"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://marketplace.visualstudio.com/items?itemName=eventyret.bootstrap-4-cdn-snippet"&gt;Bootstrap 4 CDN Snippet&lt;/a&gt;:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--pp7gKTPN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fxs6cyswv5qvmgkvl5vf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--pp7gKTPN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fxs6cyswv5qvmgkvl5vf.png" alt="Imagen de referencia de la extensión Bootstrap 4 CDN Snippet en el marketplace de VS Code, donde se puede leer que está creada por Simen Daehlin, tiene 182.479 descargas y 5/5 estrellas de 10 reviews." width="880" height="198"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=dsznajder.es7-react-js-snippets"&gt;React:&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--UZBAfBfG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fnnf6rgmarwz75427e1z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--UZBAfBfG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fnnf6rgmarwz75427e1z.png" alt="Imagen de referencia de la extensión ES7/React/Redux/GraphQL/react-native en el marketplace de VS Code, donde se puede leer que está creada por dsznajder, tiene 4.170.230 descargas y 4.5/5 estrellas de 44 reviews." width="880" height="159"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Y un montón más que se pueden consultar en el &lt;a href="https://marketplace.visualstudio.com/vscode"&gt;MarketPlace del VS Code&lt;/a&gt; y que me tienen loca.&lt;/p&gt;

&lt;p&gt;Y creo que hasta aquí mi Oda a los Snippets... Como siempre cualquier feedback (si es con amor o gatos) es bien recibido.&lt;/p&gt;

&lt;p&gt;Referencias:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://code.visualstudio.com/docs"&gt;Documentación oficial VS Code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://marketplace.visualstudio.com/vscode"&gt;MarketPlace VS Code&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>spanish</category>
      <category>codenewbie</category>
      <category>vscode</category>
      <category>snippets</category>
    </item>
    <item>
      <title>Sé más de testing que ayer (Episodio 3: los matchers más guays de Jest)</title>
      <dc:creator>Marta Rey</dc:creator>
      <pubDate>Wed, 01 Sep 2021 17:27:55 +0000</pubDate>
      <link>https://dev.to/martreyz/se-mas-de-testing-que-ayer-episodio-3-los-matchers-mas-guays-de-jest-2n1l</link>
      <guid>https://dev.to/martreyz/se-mas-de-testing-que-ayer-episodio-3-los-matchers-mas-guays-de-jest-2n1l</guid>
      <description>&lt;p&gt;Cuando decidí empezar a aprender a estudiar testing por mi cuenta tuve que pasar muy por encima algunas cosas para ser capaz de darle un "concepto general" a lo que estaba aprendiendo. Como creo que ya conté en anteriores episodios de "Sé más de testing que ayer" (muy Troy McLure me ha quedado), cuando por fin me hice una idea general y ya tenía la documentación más o menos ubicada (yo es que antes de que una documentación me sea útil necesito un proceso de adaptación) me puse a hacer testing de forma, se podría decir, obsesiva. &lt;/p&gt;

&lt;p&gt;Desde que supe montar mi primer test, empecé a incluir testing en las pruebas técnicas que hacía, y en mis ratos libres hice los tests de una buena parte del repositorio que uso para resolver retos de Hackerrank. A medida que avanzaba haciendo test a diferentes funciones y aplicaciones me daba cuenta que los matchers tienen mucho más protagonismo e importancia de la que yo me había imaginado en un principio.&lt;/p&gt;

&lt;p&gt;Entiendo que es una evolución normal, pasar de creer que "toBe" vale para todo, a saber que hay ocasiones en el que no lo puedes usar, a darte cuenta de que sin variar y bucear un poco en los matchers existentes no vas a poder sacarle el máximo partido a Jest, pero a mí me lo tuvieron que contar, la verdad.&lt;/p&gt;

&lt;p&gt;Han pasado aproximadamente tres meses de la última vez que escribí sobre mis avances con los test unitarios en Jest y creo que ha llegado el momento de recopilar los matchers que me resultan más guays y útiles. Jest y yo hemos pasado por mucho juntos y nos lo merecemos. &lt;/p&gt;

&lt;p&gt;Matchers básicos: Para una función básica donde tengamos unos parámetros, una operación y un return, usaremos estos matchers. Es una forma de decir “espero que si le mando estos datos a esta función me devuelva esto otro”. Como veremos a continuación, dependiendo del tipo de dato que devuelva la función podremos usar uno u otro:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;toBe: comprueba una igualdad entre strings o números ( expect(2+2).toBe(4);). Se puede utilizar not.toBe si queremos negar una igualdad.
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--9bXGhh5y--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2pl11z3ena9o6q7y11oq.PNG" alt="toBe example"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--23pGDSRE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ecxiewyzbnmy785cuzs5.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--23pGDSRE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ecxiewyzbnmy785cuzs5.PNG" alt="toBe example"&gt;&lt;/a&gt;    &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Con array y objetos sólo devolverá true cuando lo comparemos consigo mismo, en caso contrario aunque todas las propiedades sean iguales devolverá false.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--0-f31Q2d--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7ic31xjacizwolclaau6.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--0-f31Q2d--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7ic31xjacizwolclaau6.PNG" alt="toBe array example"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;toEqual: Es el matcher adecuado para comprobar la igualdad en un objeto o array utilizaremos toEqual, ya que verificará y comparara los campos uno a uno. Podremos utilizar not.toEqual si queremos negar la igualdad.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--1zuXknnN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/uy4tnvyex3sm5evo0usd.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1zuXknnN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/uy4tnvyex3sm5evo0usd.PNG" alt="toEqual example"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pues con esos dos matchers era que yo resolvía todos los problemas de testing que me iban surgiendo, hasta que un día una idea llegó a mí: “cuanta más información de lo que estás probando le des tú a Jest, más información te va a devolver él en caso de fallo”. Y ojo esto es importante, porque en cuanto empiezas a testear proyectos más grandes con funciones más diversas te das cuenta de que, o construyes una relación de respeto con Jest, o te va a amargar la existencia día a día y sin ningún remordimiento. &lt;/p&gt;

&lt;p&gt;Total, que hay momentos en los que dices “si es que yo no quiero comparar lo que devuelve esto, yo solo quiero saber que devuelve algo, o que no”. Pues claro, y muy lógico, y para eso hay un puñado de matchers que se denominan “de veracidad” y que se encargan de verificar a null, undefined, truthy o falsy. De este modo, si como veíamos en los primeros ejemplos, quisiéramos testear que una función devuelve algo simplemente podremos usar .not.toBeUndefined(), por ejemplo.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--C9AftDi5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qlg2qeru6qc6zgqtj9aq.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--C9AftDi5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qlg2qeru6qc6zgqtj9aq.PNG" alt="veracity matchers"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Del mismo modo podríamos validar si una función ha sido llamada con .toHaveBeenCalled();&lt;/p&gt;

&lt;p&gt;Por otro lado, en lo referente a los números, aunque lo más habitual será usar el toBe o toEqual del principio, puede que yo tenga una función que genera números aleatorios del 1 al 10, y que quiera verificar que el resultado siempre está por debajo de 10 y por encima de 1, pues bien en ese caso tenemos un grupete de matchers que nos pueden ayudar como .toBeGreaterThanOrEqual() y .toBeLessThanOrEqual().&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--VOASukJ6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hs90lc5bojos66gpbtfn.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--VOASukJ6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hs90lc5bojos66gpbtfn.PNG" alt="comparative matchers"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Y también nos ocurrirá que tengamos que comprobar si un objeto o array tiene cierta propiedad o valor, pero no queramos comprobar la igualdad del array completo como haríamos con .toEqual(). Para esto podremos usar .toContain() (para valores en caso de arrays), .toMatchObject()(para clave-valor en caso de objetos), o .toHaveProperty() en el caso de que queramos verificar si existe una propiedad, independientemente de su valor.  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--5wjzwEnS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/y9xoi75bxm3eltpe1srf.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5wjzwEnS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/y9xoi75bxm3eltpe1srf.PNG" alt="partial equality"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Del mismo modo, podríamos corroborar si algo es instancia de una clase con .toBeInstanceOf().&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--qAzgZKh3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/255is8dy9vp4nz4n519u.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qAzgZKh3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/255is8dy9vp4nz4n519u.PNG" alt="classes matchers"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;En cuanto a los strings, podremos usar .toMatch() para verificar una igualdad parcial o incluso una expresión Regex (de las cuales por cierto me está llegando ya la hora de aprender algo y son firmes voluntarias para aparecer en un post próximamente).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--S-fTUEsO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/047nnwmttd2s20lzev55.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--S-fTUEsO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/047nnwmttd2s20lzev55.PNG" alt="regex and partial equality in strings"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Por último, habrá ocasiones en las que tengamos que trabajar con una excepción, ya que el test cubre algún caso en el que se genera un error y lo queremos testear también. En estas ocasiones usaremos .toThrow(), o .toThrowError() si queremos validar el mensaje concreto que devolverá la excepción. Al respecto de estos dos matchers es importante indicar que el código de prueba deberá estar metido en una función, de lo contrario el test fallará y no llegará a validar el error. Esto lo podremos hacer creando una función y utilizándola luego en el expect, o introducir el código directamente en una arrow function dentro del expect.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--AqR6MYXH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/v483zpexj56wiszjo7o2.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--AqR6MYXH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/v483zpexj56wiszjo7o2.PNG" alt="throw matchers"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Como esto es lo típico que leerlo muy bien pero luego no te acuerdas y cuando lo necesitas tienes que volverlo a mirar todo desde cero… (y como soy una gran amante de las cheat sheets) dejo a continuación un esquemita resumen así como de mi cosecha por si a alguien le fuera remotamente útil :)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ird2i57E--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/uwqdr2ah2saipku1k34e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ird2i57E--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/uwqdr2ah2saipku1k34e.png" alt="cheatsheet"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Como siempre, cualquier comentario, si es con amor o gatos, es bien recibido.&lt;/p&gt;

</description>
      <category>spanish</category>
      <category>codenewbie</category>
      <category>javascript</category>
      <category>testing</category>
    </item>
    <item>
      <title>Sé más de testing que ayer (Episodio 2: Testeando el DOM y con la asincronía hemos topao')</title>
      <dc:creator>Marta Rey</dc:creator>
      <pubDate>Fri, 21 May 2021 18:52:54 +0000</pubDate>
      <link>https://dev.to/martreyz/se-mas-de-testing-que-ayer-episodio-2-testeando-el-dom-y-con-la-asincronia-hemos-topao-1k9e</link>
      <guid>https://dev.to/martreyz/se-mas-de-testing-que-ayer-episodio-2-testeando-el-dom-y-con-la-asincronia-hemos-topao-1k9e</guid>
      <description>&lt;p&gt;Si, como yo, eres desarrollador/a junior sin experiencia, tengo buenas noticias para ti: el mercado laboral para nosotras por fin se activa después de muchos meses de frustración y pocas oportunidades. Si, como yo, ya te habías dado cuenta, supongo que entenderás ese sentimiento de: ¿A dónde ha ido a parar todo el tiempo que yo tenía para leer y estudiar?&lt;/p&gt;

&lt;p&gt;Y es que no es solo el tiempo que invertimos en hacer las pruebas/tests/entrevistas propias de los procesos de selección, es todo el tiempo a mayores que dedicas a desgastar el botón de actualizar del email y estar súper nerviosa por tu futuro inmediato (porque digan lo que digan todos nos ponemos un poco nerviosos en esos momentos, y ponerse nervioso también lleva su tiempo y ocupa su espacio en la vida).&lt;/p&gt;

&lt;p&gt;¿Que todo esto que estoy diciendo parecen excusas para acabar diciendo que he dejado lo del testing? Correcto, pero no es el caso. ¿Que entonces para qué lo cuento? Pues porque hablo mucho y la síntesis no es lo mío y tal. &lt;/p&gt;

&lt;p&gt;Centrándome en lo que me ocupa, durante esta semana he estado afianzando las funciones mock y probando el testeo de DOM, que no hubiera imaginado yo que era la fiesta que ha resultado ser. No fue una decisión consciente, me puse un día a hacer tests, coincidió que uno afectaba al DOM, y me di cuenta de que no funcionaba tal y como yo esperaba, vamos, no funcionaba en absoluto. Decidida me fui a la documentación y me encontré con esta guía específica de "Manipulación del DOM": &lt;a href="https://jestjs.io/es-ES/docs/tutorial-jquery" rel="noopener noreferrer"&gt;https://jestjs.io/es-ES/docs/tutorial-jquery&lt;/a&gt; , leyendo eso me quedó claro que tenía que hacer algo especial para testear manipulaciones del DOM, pero en el ejemplo se usaba jQuery y yo estaba trabajando en JS Vanilla; además yo quería entender el por qué de lo que estaba pasando, así que no demoré, me puse las gafas de persona lista que lee mucho y empecé a investigar.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Asincronía&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Tengo la teoría de que en todas las profesiones hay una pared con la que te encuentras constantemente estés haciendo lo que estés haciendo, y también la sensación de que en desarrollo front una de esas paredes tiene que ser la asincronía. &lt;/p&gt;

&lt;p&gt;¿Y qué pinta ahora la asincronía aquí? Pues bien, como seguro sabrás el código JS es asíncrono (es decir, sus funciones no se ejecutan en completa correspondencia temporal), y esto genera que cuando el test llega a la función empiecen a producirse errores debido a que no es capaz de reconocer las referencias a elementos HTML que se va encontrando. Por poner un ejemplo claro y sencillo: si le hacemos un test con Jest a una función que en algún punto recoge el elemento con clase "input" en HTML y le añade contenido de esta forma:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4tyl1eb1ky0oyxsg502r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4tyl1eb1ky0oyxsg502r.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Jest no ejecutará el test, ya que no será capaz de reconocer esa parte del DOM a la que estamos intentando acceder y dará un error.  Esto mismo pasará con cualquier propiedad que hayamos utilizado y que actúe leyendo o modificando algún elemento HTML, dará error y el test no se ejecutará.&lt;/p&gt;

&lt;p&gt;A esto se le suma un tema importante para el testing de front que me encontré por el camino mientras buscaba desesperada soluciones a todos mis problemas, y es que en un vídeo de CodelyTV (que dejaré referenciado abajo y es súper recomendable si estás empezando como yo) nos explican la importancia de centrarse en testear como usuario y no como desarrollador, es decir, que a la fuerza tenemos que acceder al HTML en algún momento.&lt;/p&gt;

&lt;p&gt;En ese mismo vídeo Nuria hace una aproximación magistral y súper amplia al testing con Jest y Testing Library en 17 minutos (lo he tenido que mirar varias veces porque no sé cómo se puede contar tanto en tan poco tiempo... me quedo anonadada). Testing Library es una librería complementaria a Jest que viene a resolver el problema que comentábamos antes y que, aunque yo creía que su uso estaba limitado a la existencia de algún framework, según he visto posteriormente se puede utilizar en JS Vanilla también (dejo abajo un repositorio de GitHub con un ejemplo detalladísimo de esto y varias referencias a artículos súper interesantes sobre el tema).&lt;/p&gt;

&lt;p&gt;Así que sí, ahí estaba yo con un test súper sencillo generando cinco mil errores que no había visto nunca, y unas 20 pestañas de Chrome abiertas cada una con información distinta (pero en todos los casos muy confusa) a sumar a mi maraña mental. Estaba viviendo uno de esos momentos en los que te dices mentalmente: "Recoge tus cuchillos y vete, es imposible que salgas de esta" cuando de repente di con EL  artículo, una persona que hace un año explicó exactamente lo que yo necesitaba saber en el presente. Dejo a continuación el link al artículo que está rebien explicado y masticado &lt;a href="https://dev.to/ms314006/use-jest-write-unit-testing-for-dom-manipulation-3n6c"&gt;https://dev.to/ms314006/use-jest-write-unit-testing-for-dom-manipulation-3n6c&lt;/a&gt; . Básicamente explica cómo debemos utilizar Jest (sin librerías adicionales) para testear funciones que manipulan el DOM en JS vanilla, vamos, que lo necesites cuando estás leyendo esto o no, si todavía no sabes de testing déjate ese artículo en marcadores que te va a venir bien.&lt;/p&gt;

&lt;p&gt;Una vez superada la fase "ERRORES A LO LOCO" conseguí hacer mi primer test: "cuando le doy aquí tiene que aparecer esto". Estupendo. Funciona. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Funciones mockeadas&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Llega el momento de hacerle un test a un input con un evento de escucha, quiero testear si llama correctamente a la función handler. ¡Pues a buscar otra vez! Aunque esta vez la búsqueda fue mucho más acotada y rápido di con la solución que más se ajustaba a lo que necesitaba: las funciones mockeadas. Es cierto que en el episodio 1 de "Sé más de testing que ayer" ya comenté su existencia, pero la realidad es que no llegué a desarrollar su aplicación.  &lt;/p&gt;

&lt;p&gt;Las funciones mockeadas son funciones "espía", ¿Qué quiere decir esto?, que son funciones que nos permite crear Jest y que nos "cuentan" el comportamiento que tendrá cualquier otra función en su lugar. Imaginemos que tenemos una función llamada scaleImage() que se activa con la modificación de un input de tipo range (el típico zoom) por parte del usuario, si queremos saber exactamente cómo se comportará esa función haremos un test con ese mismo input apuntando a una función mockeada (en el ejemplo inputSize cuando ocurra el evento "mousemove" disparará mockFn, nuestra función mockeada), que como es nuestra espía nos contará todo lo que ha ocurrido cuando se le ha llamado. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqpohndfvtefb816xp63h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqpohndfvtefb816xp63h.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;En el código de ejemplo añadimos una implementación a la función mockeada, es decir, le decimos qué queremos que haga cuando la disparemos. Como cualquier otra función, si no le indicamos el valor a devolver o no indicamos una implementación, devolverá undefined.&lt;/p&gt;

&lt;p&gt;En esta página de la documentación de Jest están todos los métodos que podemos usar con las funciones mock (para "preguntarle" detalles de su comportamiento o establecer la implementación entre otros muchos): &lt;a href="https://jestjs.io/es-ES/docs/mock-function-api" rel="noopener noreferrer"&gt;https://jestjs.io/es-ES/docs/mock-function-api&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Hasta aquí mi avance de esta semana con Jest, como siempre, cualquier feedback (si es con amor o gatos) es bien recibido :)&lt;/p&gt;

&lt;p&gt;Recursos: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Repositorio GitHub sobre testing en JS Vanilla con Jest+Testing Library (las referencias que deja el autor también son de muchísima utilidad para el contexto): &lt;a href="https://github.com/thawkin3/dom-testing-demo" rel="noopener noreferrer"&gt;https://github.com/thawkin3/dom-testing-demo&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Vídeo youtube Midudev de testing en React JS con Jest+Testing Library: &lt;a href="https://www.youtube.com/watch?v=KYjjtRgg_H0" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=KYjjtRgg_H0&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Vídeo CodelyTV: &lt;a href="https://www.youtube.com/watch?v=SH7JSlc36uA" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=SH7JSlc36uA&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>spanish</category>
      <category>codenewbie</category>
      <category>javascript</category>
      <category>testing</category>
    </item>
    <item>
      <title>Sé más de testing que ayer (Episodio 1: Tests unitarios en Jest y JS vanilla)</title>
      <dc:creator>Marta Rey</dc:creator>
      <pubDate>Wed, 12 May 2021 10:41:31 +0000</pubDate>
      <link>https://dev.to/martreyz/se-mas-de-testing-que-ayer-episodio-1-tests-unitarios-en-jest-y-js-vanilla-40h8</link>
      <guid>https://dev.to/martreyz/se-mas-de-testing-que-ayer-episodio-1-tests-unitarios-en-jest-y-js-vanilla-40h8</guid>
      <description>&lt;p&gt;Lo que más me llamó la atención cuando empecé a estudiar programación fue la inmensidad de este mundillo: siempre hay algo que estudiar o probar, alguna librería o tecnología que no conocías y que te parece una fantasía del futuro. &lt;/p&gt;

&lt;p&gt;Ahora mismo me parece imposible aburrirse o cansarse del desarrollo, y cada vez que estoy un rato viendo posts en dev.to, o la pestaña de trending de Codepen, o incluso Twitter, me reafirmo en que la información del mundo tech es tremendamente adictiva. No puedo contar las veces que he empezado leyendo un tweet del que no entendía la mitad y eso me ha llevado a dos o tres horas de investigación concatenada saltando de una página a otra buscando conceptos que me van apareciendo y de los que, hasta ese momento, no tenía ni idea.&lt;/p&gt;

&lt;p&gt;Releyendo el párrafo anterior me veo obligada a hacer un disclaimer, ya que yo estoy totalmente en contra de romanticismos absurdos e innecesarios, y la verdad es que todo eso que he contado me pasa solo cuando tengo un buen día: cuando tengo un buen día abro una cosa y otra y voy estudiando, investigando, aprendiendo y me lo paso pirata, y si quisiera pasarme la vida así tendría contenidos para hacerlo. Pero no podemos contar con que todos los días van a ser buenos (yo al menos no), y los días malos esa misma inmensidad del mundo tech me resulta abrumadora y me deja sentada en la silla mirando a la pantalla sin saber muy bien a qué echarle mano.&lt;/p&gt;

&lt;p&gt;Así que hace un par de semanas me hice un roadmap (que aunque suena como una cosa muy complicada, es simplemente apuntarte en algún sitio una lista de los lenguajes, tecnologías, librerías, etc que quieres aprender, por el orden en el que tiene sentido aprenderlos). Considero a mi roadmap un ente dinámico y en constante modificación, donde es posible cualquier variación sobre el camino inicialmente establecido, siempre y cuando tenga sentido (era la única forma de conseguir hacer una lista de cosas sin volverme loca pensando en qué me estaba dejando fuera).&lt;/p&gt;

&lt;p&gt;¿Y por qué cuento todo esto que no tiene nada que ver con nada? Pues porque no fue hasta que hice este roadmap que me di cuenta de que no le estaba dejando lugar a aprender testing, lo cual resulta increíble con las veces al día que escucho o leo a alguien recordar las bondades e importancia de los tests. Si bien es cierto que aprendí a hacer test unitarios con Jest en el bootcamp, cuando estás aprendiendo muchas cosas nuevas reconoces a la perfección cuando manejas algo "bien bien" o "más bien no", y yo soy plenamente consciente de que en Jest en concreto y testing en general soy un "más bien no".&lt;/p&gt;

&lt;p&gt;Así que había llegado el momento, y este lunes por fin abrí de nuevo la documentación de Jest. Después de eso decidí que necesitaba amenizarme un poco la existencia y que entrar así a palo con una documentación igual no era lo mejor para coger el tema con cariño, así que recurrí a quien considero mi niñera, profesor y mejor amigo: Youtube. Creo que no le descubro nada a nadie con los vídeos que me han parecido interesantes y me han ayudado a dar un contexto general previo muy sólido, pero igualmente los dejaré linkados al final del post por si a alguien le fueran de utilidad.&lt;/p&gt;

&lt;p&gt;Mi principio: Test unitarios&lt;/p&gt;

&lt;p&gt;Igual que me pasa con el mundillo Tech en general, el mundillo testing me parece inmenso para abordarlo. Como por algún sitio hay que empezar, yo he decidido empezar por el principio, y esta semana me he dedicado a aprender "Tests unitarios con Jest en JavaScript vanilla" (que suena un poco como cuando mi madre me presenta a alguien, que dice que soy su hija "Marta, la pequeña, que vive en Madrid pero está aquí un par de días de visita" y siempre me siento como con un apellido muy largo, como si fuera yo de la nobleza o algo). &lt;/p&gt;

&lt;p&gt;Total, que allí me puse. Después de una mañana viendo y leyendo información me animé a empezar a intentarlo por mi cuenta: abrí un repositorio que tengo con todos los challenges que voy haciendo en Hackerrank y empecé a hacerle tests a todos (que son unos cuantos). &lt;/p&gt;

&lt;p&gt;De mi aventura con los tests unitarios con Jest en JavaScript vanilla saco los siguientes aprendizajes y conclusiones:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;La instalación es súper sencilla y únicamente hay que añadir al package.json, en los scripts, la siguiente configuración: "test": "jest"; y otro objeto llamado "jest" al que le indicaremos la clave "testEnvironment" y el valor "node" (parecerá absurdo pero a mí solo la instalación de según qué cosas se me hace una bola gigante).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--rWB3QvrB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tdg2s3ooc2oprbr4aloe.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--rWB3QvrB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tdg2s3ooc2oprbr4aloe.png" alt="Instalación" width="268" height="135"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hay diferentes modos de organizar los ficheros de funcionalidades y los de test, pero la que me parece más fácil y práctica es mantener los ficheros de test al lado del los ficheros que testean.&lt;/li&gt;
&lt;li&gt;Los ficheros donde vayamos a hacer test deben usar la extensión .test.js para que Jest los reconozca al arrancarlo.&lt;/li&gt;
&lt;li&gt;La función o funciones a testear deben exportarse de su fichero mediante module.exports = {}. Indicando dentro las funciones a exportar.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--CJvc3lbK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4pkbcn2o61r835243wc6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--CJvc3lbK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4pkbcn2o61r835243wc6.png" alt="Export" width="148" height="63"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;La función o funciones a testear deben importarse en el fichero de test guardándolas en una constante con require:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--g9Mh-jWm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3yjet4r1u9xu8qyi99jo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--g9Mh-jWm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3yjet4r1u9xu8qyi99jo.png" alt="Import" width="606" height="23"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Los test son también una forma de documentar, ya que muestran a la perfección lo que deben hacer los métodos.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;El test siempre tiene que fallar primero para saber que está bien construido y que puede fallar, de lo contrario no podremos saber si no nos da fallo porque ha pasado correctamente o porque no está funcionando como esperado.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Para crear un test unitario de la forma más sencilla únicamente tendremos que utilizar el método test() con dos argumentos: el primero será la descripción de lo que hace el test, lo indicaremos como un string entre comillas; el segundo es una función donde estará el test en sí, y donde utilizaremos la constante donde anteriormente hemos guardado la función importada:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--wVHHaytk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/su40w4ujaig3ttqhm9un.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--wVHHaytk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/su40w4ujaig3ttqhm9un.png" alt="Test" width="457" height="65"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;En la mayoría de casos yo he utilizado el método expect() para crear el test, aunque existen muchos otros que pueden ser más ajustados a las necesidades concretas y se listan aquí: &lt;a href="https://jestjs.io/docs/expect"&gt;https://jestjs.io/docs/expect&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;El método expect() recibe como parámetro la función a testear. Posterior a expect debemos usar un matcher, que es otro método que recibe la validación a realizar. En mi caso particular he intentado utilizar y probar todos los matchers que he podido, aunque considero que en la mayoría de las ocasiones podría haberme limitado a usar el .toBe (han sido muchos tests, de alguna forma tenía que mantener viva la llama entre Jest y yo).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Según el tipo de dato que tengamos que validar podremos usar ciertos matchers, en la documentación está indicado pero además la propia consola te sugiere el matcher a utilizar cuando has usado uno que no podías.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Jest tiene un watch mode muy útil que me ha hecho muy feliz: jest --watchAll&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Existen las funciones mockeadas, que son funciones espía medio fake que creamos cuando necesitamos que ésta nos "chive" exactamente cuándo y cómo se le está llamando.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Y esta ha sido la primera de (preveo) varias semanas con testing. Cualquier feedback (si es con amor o gatos) es bienvenido :)&lt;/p&gt;

&lt;p&gt;Recursos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Documentación: &lt;a href="https://jestjs.io/"&gt;https://jestjs.io/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a class="mentioned-user" href="https://dev.to/midudev"&gt;@midudev&lt;/a&gt; &lt;a href="https://www.youtube.com/watch?v=_DzBez4qMi0&amp;amp;t=594s"&gt;https://www.youtube.com/watch?v=_DzBez4qMi0&amp;amp;t=594s&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;@maxedapps &lt;a href="https://www.youtube.com/watch?v=r9HdJ8P6GQI"&gt;https://www.youtube.com/watch?v=r9HdJ8P6GQI&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Repositorio donde están mis retos de Hackerrank por si le es útil a alguien para practicar: &lt;a href="https://github.com/martreyz/hackerrank_challenges"&gt;https://github.com/martreyz/hackerrank_challenges&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>testing</category>
      <category>javascript</category>
      <category>noob</category>
      <category>spanish</category>
    </item>
    <item>
      <title>CSS tiene planes para ti - Polaroid funcional con CSS y JavaScript</title>
      <dc:creator>Marta Rey</dc:creator>
      <pubDate>Thu, 29 Apr 2021 16:37:05 +0000</pubDate>
      <link>https://dev.to/martreyz/css-tiene-planes-para-ti-polaroid-funcional-con-css-y-javascript-4l15</link>
      <guid>https://dev.to/martreyz/css-tiene-planes-para-ti-polaroid-funcional-con-css-y-javascript-4l15</guid>
      <description>&lt;p&gt;Cuando acabé el bootcamp tenía ganas de hacer cosas, no sabía qué cosas, pero cosas. Me pasé varias semanas enganchadísima a Hackerrank y sus retos de código: los primeros días es un tormento (al menos para mí lo fue), pero poco a poco vas cogiéndole el punto, vas ganando medallitas, te sueltan confetti para celebrar tus avances y es un mundo de fantasía del que no quieres salir.&lt;/p&gt;

&lt;p&gt;Pero un día por algún motivo entré en Codepen, descubrí la pestaña de "trending" (esa pestaña para mí ahora mismo es un pozo donde tiro horas del día al nivel "lupa de Instagram"), y vi la primera Polaroid hecha en CSS. Aluciné. Y después de alucinar me apunté lo de la polaroid para que no se me olvidara hacerla algún día con tanto alucine.&lt;/p&gt;

&lt;p&gt;Total, que esta semana me encontré un pen de hace meses con una prueba rápida de cómo abrir la cámara y sacar fotos utilizando HTML y JavaScript y, aun siendo millennial y junior y todo, me di cuenta de que era el momento perfecto para intentar LA POLAROID (siento el grito, de alguna forma tenía que enfatizarlo después de la chapa introductoria).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqi18kydeuj2m1mjwcqwg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqi18kydeuj2m1mjwcqwg.png" alt="CSS Polaroid screenshot"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A parte de estar tremendamente emocionada con esta creación por el resultado final en relación a mis expectativas, tengo que decir que ha sido uno de los proyectos CSS más agradecidos que he hecho hasta el momento. Obviamente me ha llevado su buen tiempito (demasiados detalles en la foto para tan poca experiencia en CSS), pero para nada ha sido la tortura que me había imaginado.&lt;/p&gt;

&lt;p&gt;Tanto es así que me he permitido el lujo de volver a hacer una cheat sheet con las partes que me resultan más complicadas o "difíciles de simplificar":&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fik161u7123xluiqn93oe.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fik161u7123xluiqn93oe.jpg" alt="CSS Polaroid cheat Sheet"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dejo por aquí el link a Codepen donde está todo el código que he usado para hacerla: &lt;a href="https://codepen.io/martreyz/pen/ExNvbGd" rel="noopener noreferrer"&gt;https://codepen.io/martreyz/pen/ExNvbGd&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Cualquier feedback (si es con amor o gatos) es bien recibido! :)&lt;/p&gt;

</description>
      <category>css</category>
      <category>polaroid</category>
      <category>codenewbie</category>
      <category>spanish</category>
    </item>
    <item>
      <title>¿Se acuerdan de lo de Redux?... Que por no guardar una cosa en el estado... toda esa mierda?</title>
      <dc:creator>Marta Rey</dc:creator>
      <pubDate>Fri, 23 Apr 2021 10:24:03 +0000</pubDate>
      <link>https://dev.to/martreyz/se-acuerdan-de-lo-de-redux-que-por-no-guardar-una-cosa-en-el-estado-toda-esa-movida-2k3m</link>
      <guid>https://dev.to/martreyz/se-acuerdan-de-lo-de-redux-que-por-no-guardar-una-cosa-en-el-estado-toda-esa-movida-2k3m</guid>
      <description>&lt;p&gt;Este lunes por fin me decidí a reorganizar los cientos de miles de recursos que he ido acumulando desde que empecé en el desarrollo front end y tenía inconvenientemente repartidos por todas partes: elementos guardados de Twitter, marcadores de Chrome, distintas páginas en Notion, mensajes a mí misma en Whatsapp, mensajes a mí misma en Slack e incluso en algún email a mí misma.&lt;/p&gt;

&lt;p&gt;A mitad de esa misma mañana ya había dejado la organización para el martes y empezado un tutorial de Youtube que me había encontrado en alguno de mis "trasteros digitales". No me avergüenzo de mi decisión, creo que cualquiera al que le vengan por primera vez con que si "estados globales", que si "concurrencia", que si "eliminación de la asincronía de JS" y demás bondades de Redux hubiera hecho lo mismo que yo.&lt;/p&gt;

&lt;p&gt;Redux es una librería de gestión de estado para aplicaciones JavaScript, que no suena tan impresionante como luego resulta ser, de verdad lo digo. &lt;/p&gt;

&lt;p&gt;Los tres personajes principales aquí son: el "store" (el almacén, donde guardamos los estados de forma global), las "actions" (debe haber una acción para cada uno de los eventos que ocurren en la página, cada action tiene un identificador único que nos permite "dispararlas" de forma independiente y controlada), y los "reducers" (funciones puras que definen el resultado de cada una de las acciones en nuestro estado).&lt;/p&gt;

&lt;p&gt;Yo he acabado asimilando cómo funciona comparándolo con un montacargas de comida de un hotel (el pasado siempre vuelve):&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fml5h6rnh3rd6gndh3kta.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fml5h6rnh3rd6gndh3kta.jpg" alt="Elevator Redux"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;De esta forma, en mi cabeza el "store" es la cocina, los "reducers" son los montacargas y las "actions" serían el botón que llama al montacargas. Es decir, en Redux utilizaremos una action para disparar los reducers que estén afectados por esa action, y que nos ayudarán a hacer la gestión de estado en el store.&lt;/p&gt;

&lt;p&gt;Desde que he empezado a aprender Redux he debido de leer unas 50 veces que no se debe utilizar para proyectos pequeños, ya que el uso de Redux complica el código y hay en ocasiones que no nos va a resultar rentable, pero claro, ¡Yo quería probarlo! Así que he hecho un pequeño cronómetro muy sencillo (pero muy matón) en el que toda la funcionalidad trabaja usando Redux:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwmgq4d40pz4vcdoa748j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwmgq4d40pz4vcdoa748j.png" alt="Cronómetro"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Aunque dejaré abajo el repositorio del proyecto, porque compartir es vivir, no tiene mucho sentido que me ponga a contar cómo lo hice (seamos honestos, llevo literalmente cuatro días usando Redux y habrá partes como para llevarse las manos a la cabeza). Sin embargo sí que me ha parecido interesante dejar por aquí ciertos puntos que podrían resultarte de mucha utilidad si has decidido empezar con Redux y no te puedes permitir perder la cabeza en el intento como llevo haciendo yo cinco días:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Redux está basado en el paradigma de programación funcional, que a mí por lo menos me pillaba muy lejana de mi adorada "orientada a objetos", por lo que tuve que dar un rodeo bastante amplio antes de entrar en materia para contextualizarme un poco.&lt;/li&gt;
&lt;li&gt;En mi proyecto lo utilicé con React JS, pero se puede utilizar Redux con cualquier framework JS, incluso con JS vanilla.&lt;/li&gt;
&lt;li&gt;En caso de utilizarlo con React JS, el routing se tiene que hacer diferente a como estamos habituados. Para usarlo en Redux deberemos recurrir a Connected React Router, en su repositorio de GitHub dejan información detallada sobre la instalación y configuración: &lt;a href="https://github.com/supasate/connected-react-router" rel="noopener noreferrer"&gt;repositorio GitHub&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Si has desarrollado usando estados, ten muy presente el cómo harías cada cosa en la librería o framework que conoces, ya que todo va a funcionar muy parecido. Yo me pasé dos días buscando una solución para la función de restart y no di con ella hasta que pensé en cómo lo haría con ReactJS únicamente.&lt;/li&gt;
&lt;li&gt;Entre los fundamentos de Redux se encuentra la inmutabilidad, es decir, cuando creamos un objeto no podremos mutarlo, tendremos que hacer una copia y mutar esa copia. Por este motivo, te va a resultar de muchísima utilidad entender y practicar el spread antes de ponerte manos a la obra (esto ayudará a que el código no sea tan verboso y quede todo más limpio y legible, por no decir que mola mucho y te quedas con toda la peña usándolo).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Recursos mencionados/utilizados:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Proyecto cronómetro: &lt;a href="https://github.com/martreyz/redux-sports-watch" rel="noopener noreferrer"&gt;https://github.com/martreyz/redux-sports-watch&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Tutorial Mosh Hamedani (Twitter: @moshhamedani): Dura hora y media y en la introducción habla también de la programación funcional, ultra completo! &lt;a href="https://www.youtube.com/watch?v=poQXNp9ItL4&amp;amp;t=4727s" rel="noopener noreferrer"&gt;Vídeo Mosh Hamedani&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Tutorial Dev Ed (Twitter: @deved94) : Dura media hora, yo lo vi después del de Mosh Hamedani y me vino muy bien para aclarar ciertas dudas ver una construcción más sencilla, además personalmente este chico me cae estupendamente y me río mucho con sus vídeos) &lt;a href="https://www.youtube.com/watch?v=CVpUuw9XSjY" rel="noopener noreferrer"&gt;Vídeo DevEd&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Connected React Router: &lt;a href="https://github.com/supasate/connected-react-router" rel="noopener noreferrer"&gt;https://github.com/supasate/connected-react-router&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>redux</category>
      <category>codenewbie</category>
      <category>javascript</category>
      <category>spanish</category>
    </item>
    <item>
      <title>A este "cacho carrrne" le gusta CSS - Bender (Futurama)</title>
      <dc:creator>Marta Rey</dc:creator>
      <pubDate>Thu, 15 Apr 2021 16:38:10 +0000</pubDate>
      <link>https://dev.to/martreyz/a-este-cacho-carrrne-le-gusta-css-bender-futurama-2nl0</link>
      <guid>https://dev.to/martreyz/a-este-cacho-carrrne-le-gusta-css-bender-futurama-2nl0</guid>
      <description>&lt;p&gt;Tener 30 años y ser programadora front end, junior, sin experiencia laboral, y además una motivada en tus ratos libres se hace durillo, no nos vamos a engañar. Si no has pasado por esto, te cuento que la idea es pasarse todo el día haciendo cursos, aprendiendo cosas, perfeccionando skills y buenas prácticas y un largo etc mientras vas recibiendo descartes de procesos de selección.&lt;/p&gt;

&lt;p&gt;Y ¡ojo! yo también he sido junior en mi profesión anterior antes de ser senior (vamos, lo normal), pero no es la misma sensación estar empezando en el mundo laboral que pegar un volantazo a mitad de camino. Con el volantazo tienes que sumar a los agobios y preocupaciones habituales de la búsqueda de empleo el síndrome del impostor, que es una movida , y que se encarga de hacerte sentir un fraude cada vez que tiene un ratillo, y recordarte que "algún día se darán cuenta de que eres una estafa".&lt;/p&gt;

&lt;p&gt;Pues bien, yo al síndrome de impostor le doy en la cara con CSS. No es la primera vez que digo esto, pero es que es la verdad. Antes de ser "programadora impostora" ya era "dibujanta impostora" (que por cierto, era mucho más impostora como dibujanta y lo hacía con toda la normalidad del mundo, tendría que hacérmelo mirar). Total, que hacer dibujitos me entretiene, me relaja y mantiene mi foco en un lugar constructivo; y si los dibujitos se hacen en CSS y luego puedo añadirle animaciones, transiciones y JavaScript ya ni te cuento.&lt;/p&gt;

&lt;p&gt;Por lo visto si a mi síndrome del impostor le sumas la emisión de Futurama en Disney+ y un fin de semana de lluvias y pandemias de por medio resulta esto:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmmmrb5mp314yb88bfr7e.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmmmrb5mp314yb88bfr7e.PNG" alt="Bender"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;En realidad hacer a Bender con CSS no ha sido demasiado complicado ya que es un personaje con líneas bastante claras y poquitos detalles, no obstante dejo aquí un cheat sheet que he hecho con las partes que me parecen más rebuscadas por si a alguien le apetece probarlo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkesrrw1jyaqthomtf72x.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkesrrw1jyaqthomtf72x.jpg" alt="Bender cheat sheet"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Este es el trabajo en Codepen donde también está todo el código, cualquier feedback (si es con amor :)) es bien recibido!:&lt;br&gt;
&lt;a href="https://codepen.io/martreyz/pen/vYgdzog" rel="noopener noreferrer"&gt;https://codepen.io/martreyz/pen/vYgdzog&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Escrito con -^. .^- por martreyz&lt;/p&gt;

</description>
      <category>codenewbie</category>
      <category>css</category>
      <category>spanish</category>
      <category>noob</category>
    </item>
    <item>
      <title>No sé mucho de GIT pero tiro palante</title>
      <dc:creator>Marta Rey</dc:creator>
      <pubDate>Thu, 08 Apr 2021 10:14:35 +0000</pubDate>
      <link>https://dev.to/martreyz/no-se-mucho-de-git-pero-tiro-palante-2bbg</link>
      <guid>https://dev.to/martreyz/no-se-mucho-de-git-pero-tiro-palante-2bbg</guid>
      <description>&lt;p&gt;Llevo programando y usando GIT aproximadamente 7 meses, sin embargo nunca he tenido claro exactamente ni qué es, ni cómo funciona por detrás, ni cómo separar las funciones de GIT y las de GitHub. Un desastre, vamos. Pero para eso estamos aquí, para hacer una guía rápida y básica de GIT con todo lo que necesitamos saber para tirar palante con la vida como desarrolladoras.&lt;/p&gt;

&lt;p&gt;Empezando por el principio... ¿Qué es GIT? Git es un software de control de versiones, quizá esto ya lo sabíamos, pero quizá no sabíamos que se trata de software libre, y que su mantenimiento actual recibe actualizaciones de aproximadamente 280 programadores.&lt;/p&gt;

&lt;p&gt;Cuando iniciemos Git en un repositorio veremos que nos creará un subdirectorio llamado ".git". Este subdirectorio es el encargado de ir guardando el "esqueleto" de nuestro proyecto, esto es todos los archivos necesarios para su funcionamiento. A partir de este punto, iremos haciendo cambios y actualizaciones en nuestro código que podremos ir añadiendo a commits de Git, es decir, "versiones" de nuestro proyecto que se van quedando guardadas y plenamente identificadas de forma individual. ¿Y para qué todo este lío? Pues probablemente eso sea lo único que tengo claro escribiendo sobre Git, hacemos todo este lío porque pase lo que pase el software nos permitirá volver a cualquier versión anterior que necesitemos, es decir, si a mí un día se me ocurriera trabajar en un proyecto tomándome un chupito de tequila cada vez que escribo "lenght", al día siguiente podría recuperar la última versión antes del desastre.&lt;/p&gt;

&lt;p&gt;Además, Git nos permite trabajar con "ramas". El trabajo con ramas, además de estar presente en infinidad de metodologías de workflow actuales, es muy útil para cualquier tipo de proyectos, incluso los más pequeños y personales. La creación de una nueva rama es simplemente la creación de una "copia" del proyecto tal como está, en la que podrás probar nuevas funcionalidades, estilos e ideas peregrinas sin miedo de romper nada de tu avance, ya que siempre tendrás tu copia idéntica a salvo en tu rama inicial.&lt;/p&gt;

&lt;p&gt;Vale, y ahora, en toda esta bendita historia, ¿Dónde entran las plataformas como GitHub? Las plataformas como GitHub son servicios en línea a los que Git puede conectarse para subir o bajar código y recursos. Es importante, por tanto, entender en este punto que GitHub no gestiona nuestras versiones, solo se conecta con Git para recoger o dar información, o para crear nuevos commits que podamos realizar desde este repositorio remoto. &lt;/p&gt;

&lt;p&gt;A mí, como profana, me ha resultado muy útil hacer un paralelismo entre GitHub y Google Drive (como servicio de almacenamiento) para entender todo esto: Si yo escaneo un documento con una app del móvil y posteriormente lo subo a Google Drive, lo único que hace Google es guardar ese archivo, no lo ha creado. Sin embargo, si lo deseo puedo utilizar Drive como editor de ciertos archivos, y esos archivos los puedo devolver de nuevo a local y seguir trabajando con él en el editor del ordenador que sea. Pues algo así es lo que yo entiendo que ocurre con GitHub.&lt;/p&gt;

&lt;p&gt;Pero aunque yo considero súper necesario tener una desambiguación correcta de las herramientas que utilizamos antes de utilizarlas, vamos a lo que más mola, al tema que te quema, a los comandos más guays y necesarios de Git:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- git init: Inicia git, crea el subdirectorio .git que comentamos antes.
- git fetch: Revisa el repositorio remoto (el que tengamos en el servicio online X, por ejemplo en GitHub) en busca de cambios vs el local y se los descarga.
- git pull: Revisa el repositorio remoto (el que tengamos en el servicio online X, por ejemplo en GitHub) en busca de cambios vs el local, se los descarga, y los aplica a nuestra versión local.
- git add &amp;lt;nombre_archivo&amp;gt;: Añade el archivo que indiquemos a la versión (commit). Si indicamos git add -A le estaremos diciendo que añada todos los archivos para el nuevo commit.
- git commit -m "mensaje": Crea una versión con los cabios realizados en los archivos que hayamos añadido. El mensaje se utiliza para indicar una breve descripción de los cambios realizados. Según convención los commits acostumbran a ser en inglés, y comenzar por un verbo en infinitivo. (E.G "Add landing page styles").
- git push: Sube el commit realizado al repositorio remoto. Si estamos subiendo cambios en una nueva rama tendremos que indicar `git push -u origin &amp;lt;nombre_rama&amp;gt;`
- git status: Muestra el estado actual de la rama, como los cambios que hay sin commitear.
- git checkout -b &amp;lt;nombre_rama_nueva&amp;gt;: Crea una rama idéntica a en la que te encuentras con el nombre "nombre_rama_nueva", y una vez creada te lleva a esta rama nueva.
- git merge &amp;lt;nombre_rama&amp;gt;: Desde una rama X haremos merge de otra rama Y para unir ambas versiones. Realizar esta acción, dependiendo de la naturaleza de los cambios entre ambas ramas, derivará en un merge blando (git lo realizará solo y únicamente tendremos que confirmar) o un merge duro (tendremos que resolver conflictos manualmente e indicar con el código de qué rama nos queremos quedar).
- git branch -a: Crea una lista de todas las ramas (locales y remotas).
- git remote prune origin: Actualiza tu repositorio remoto en caso que algún otro desarrollador haya eliminado alguna rama remota.
- git reset --hard: Elimina todos los cambios realizados de los que aún no se haya hecho commit.
- git revert &amp;lt;commit&amp;gt;: Revierte el proyecto al commit "commit".
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>github</category>
      <category>beginners</category>
      <category>noob</category>
      <category>spanish</category>
    </item>
  </channel>
</rss>
