<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
    <channel>
        
        <title>
            <![CDATA[ pruebas unitarias - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ Descubre miles de cursos de programación escritos por expertos. Aprende Desarrollo Web, Ciencia de Datos, DevOps, Seguridad y obtén asesoramiento profesional para desarrolladores. ]]>
        </description>
        <link>https://www.freecodecamp.org/espanol/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ pruebas unitarias - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/espanol/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Sat, 30 May 2026 08:36:26 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/espanol/news/tag/pruebas-unitarias/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ Cómo escribir Pruebas usando el Ejecutor de Pruebas de Node.js y mongodb-memory-server ]]>
                </title>
                <description>
                    <![CDATA[ Recientemente migré algunas pruebas de Jest al ejecutor de pruebas de Node.js en dos de mis proyectos que usan MongoDB. En uno de esos proyectos, el tiempo de ejecución de las pruebas fue reducido de 107 segundos a 25 segundos (captura de pantalla abajo). En el otro proyecto, el tiempo ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/como-escribir-pruebas-usando-el-ejecutor-de-pruebas-de-node-js-y-mongodb-memory-server/</link>
                <guid isPermaLink="false">67bd1d95f9cd6804c5816fa9</guid>
                
                    <category>
                        <![CDATA[ nodejs ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Node ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Node.js ]]>
                    </category>
                
                    <category>
                        <![CDATA[ MongoDB ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Mongo ]]>
                    </category>
                
                    <category>
                        <![CDATA[ pruebas unitarias ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Elias Ezequiel Pereyra Gomez ]]>
                </dc:creator>
                <pubDate>Tue, 15 Apr 2025 14:27:15 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2025/02/Captura-desde-2025-02-24-22-33-31.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artículo original:</strong> <a href="https://www.freecodecamp.org/news/how-to-write-tests-using-the-nodejs-test-runner-and-mongodb-memory-server/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to Write Tests Using the Node.js Test Runner and mongodb-memory-server</a>
      </p><p>Recientemente migré algunas pruebas de Jest al ejecutor de pruebas de Node.js en dos de mis proyectos que usan MongoDB. En uno de esos proyectos, el tiempo de ejecución de las pruebas fue reducido de 107 segundos a 25 segundos (captura de pantalla abajo). En el otro proyecto, el tiempo de ejecución de las pruebas fue reducido cerca de un 66%.</p><figure class="kg-card kg-image-card"><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1738830673460/1560f7a3-38c1-42f3-8944-df06b40d73e4.png" class="kg-image" alt="76% reduction in time taken to run tests in Jest vs Node.js test runner" width="560" height="478" loading="lazy"></figure><p>Decidí compartirte cómo pude implementarlo. Pienso que te será de utilidad, ya que es más rentable (en términos de reducir dinero gastado en ejecutar pruebas en CI/CD), y también mejora tu experiencia de desarrollo.</p><h2 id="tabla-de-contenidos"><strong>Tabla de Contenidos</strong></h2><ul><li><a href="#pre-requisitos">Pre-requisitos</a></li><li><a href="#ejecutor-pruebas-nodejs">El Ejecutor de Pruebas de Node.js</a></li><li><a href="#servidor-memoria-mongodb">El Servidor en memoria de MongoDB</a></li></ul><!--kg-card-begin: markdown--><ul>
<li><a href="#como-escribir-pruebas">Cómo escribir las Pruebas</a>
<ol>
<li><a href="#configurar-proyecto">Configurar el Proyecto</a></li>
<li><a href="#configurar-esquema-mongoose">Configurar el Esquema de Mongoose</a></li>
<li><a href="#configurar-servicios">Configurar los Servicios</a></li>
<li><a href="#configurar-pruebas">Configurar las Pruebas</a></li>
<li><a href="#escribir-pruebas">Escribir las Pruebas</a></li>
<li><a href="#pasar-pruebas">Pasar las Pruebas</a></li>
<li><a href="#usa-typescript-opcional">Usar TypeScript (Opcional)</a></li>
</ol>
</li>
</ul>
<!--kg-card-end: markdown--><ul><li><a href="#conclusion">Conclusión</a></li></ul><!--kg-card-begin: html--><h2 id="pre-requisitos">Pre-requisitos</h2><!--kg-card-end: html--><p>Para seguir esta guía, deberías de tener experiencia trabajando con Node.js, MongoDB y Mongoose (o cualquier otro mapeador de datos de objetos de MongoDB). Deberías también tener instalado Node.js (al menos la versión 20.18.2) y MongoDB (Compass la versión GUI) en tu computadora.</p><!--kg-card-begin: html--><h2 id="ejecutor-pruebas-nodejs">El Ejecutor de Pruebas de Node.js</h2><!--kg-card-end: html--><p>El ejecutor de pruebas de Node.js fue introducido como una característica experimental en la versión 18 de Node.js. Se volvió disponible oficialmente en la versión 20. Te da la habilidad de:</p><ol><li>Ejecutar pruebas</li><li>Reportar resultados de las pruebas</li><li>Reportar cobertura de las pruebas (todavía experimental en la versión 23)</li></ol><p>Es una buena idea el usar el ejecutor de pruebas incorporado cuando se escriban pruebas en Node.js porque significa que tienes que usar menos dependencias externas. No necesitas instalar una librería externa (y sus dependencias entre pares) para ejecutar las pruebas.</p><p>El mejor ejecutor incorporado también es el más rápido. Basado en mi experiencia usándolo en dos proyectos (los cuales usaron Jest), vi mejoras de al menos una reducción del 66% en el tiempo que tomó ejecutar las pruebas completamente.</p><p>Y a diferencia de otros frameworks o librerías de pruebas, el ejecutor de pruebas de Node.js fue construido especialmente para proyectos de Node.js. No trata de acomodar las especificaciones de otros entornos de programación como el navegador. Las especificaciones de Node.js son su principal y única prioridad.</p><!--kg-card-begin: html--><h2 id="servidor-memoria-mongodb">El Servidor en memoria de MongoDB</h2><!--kg-card-end: html--><p>Para las pruebas que involucran el hacer peticiones a una base de datos, algunos desarrolladores prefieren imitar las peticiones para evitar hacer peticiones a una base de datos real. Hacen esto porque hacer una petición a una base de datos real requiere un montón de configuraciones que puede costar tiempo y recursos.</p><p>Escribir y solicitar datos usando una base de datos real es más lento <a href="https://www.mongodb.com/resources/basics/databases/in-memory-database">comparado con escribir y solicitar datos de la memoria</a>. Cuando se ejecutan pruebas automatizadas, usando un servidor de MongoDB real será más lento que usar un servidor de base de datos en memoria, y ahí es donde <a href="https://github.com/typegoose/mongodb-memory-server">mongodb-memory-server</a> se vuelve útil.</p><figure class="kg-card kg-image-card"><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1738832586702/62360547-70e8-4e74-854f-c7ad74d182ea.png" class="kg-image" alt="Comparison between memory and database communication with CPU" width="631" height="256" loading="lazy"></figure><p>Según su documentación, mongodb-memory-server crea y comienza un servidor de MongoDB real de forma programática desde dentro de Node.js, pero usa una base de datos en memoria por defecto. También te permite conectar el servidor de base de datos que crea usando tu mapeador de datos de objetos preferido tales como Mongoose, Prisma, o TypeORM. En esta guía, usaremos <a href="https://mongoosejs.com/">Mongoose</a> (v.8.9.6).</p><p>Ya que los datos almacenados por mongodb-memory-server reside en la memoria por defecto, es más rápido leer y escribir en él que cuando se usa una base de datos real. mongodb-memory-server también es más fácil de configurar. Estos beneficios lo hace una buena elección para usarlo como un servidor de base de datos para escribir pruebas.</p><p><strong>Nota</strong>: asegúrate de instalar la versión 9.1.6 de mongodb-memory-server para seguir esta guía. La versión 10 actualmente tiene problemas con limpiar los recursos después que se hacen las pruebas. Mira este problema con el título "<a href="https://github.com/typegoose/mongodb-memory-server/issues/912">Node forking will include any <code>--import</code> from the original command</a>".</p><p>El problema ha sido resuelto al tiempo de escribir este artículo, pero el arreglo no ha sido fusionado para las instalaciones.</p><!--kg-card-begin: html--><h2 id="como-escribir-pruebas">Cómo escribir las Pruebas</h2><!--kg-card-end: html--><p>Ahora te guiaré a través de los siguientes pasos para que comiences a escribir las pruebas:</p><ol><li>Configurar el proyecto</li><li>Configurar el esquema de Mongoose</li><li>Configurar los servicios</li><li>Configurar las pruebas</li><li>Escribir las pruebas</li><li>Pasar las pruebas</li><li>Usa TypeScript (Opcional)</li></ol><!--kg-card-begin: html--><h3 id="configurar-proyecto">1. Configurar el Proyecto</h3><!--kg-card-end: html--><p>Creé un repositorio de Github para facilitarte que sigas esta guía. Clona este repositorio en <a href="https://github.com/orimdominic/nodejs-test-runner-mongoose">nodejs-test-runner-mongoose</a> y dirígete a la rama <code>01-setup</code>. </p><p>En <code>01-setup</code>, las dependencias para el proyecto están el archivo <code>package.json</code>. Instala las dependencias usando el comando <code>npm install</code> para configurar el proyecto. Asegúrate de que la configuración esté completa y correcta, ejecuta el comando <code>node .</code> en la terminal de tu proyecto. Deberías ver tu versión de Node.js &nbsp;como una salida en la terminal.</p><pre><code class="language-bash"># instala las dependencias
npm install
...
# ejecuta el comando node
node .
# la salida
You are running Node.js v22.13.1
</code></pre><!--kg-card-begin: html--><h3 id="configurar-esquema-mongoose">2. Configurar el Esquema de Mongoose</h3><!--kg-card-end: html--><p>Configuraremos el esquema para dos colecciones (Task y User) en la rama <code>02-setup-schema</code> usando Mongoose. Los archivos <code>task/model.mjs</code> y <code>user/model.mjs</code> contienen el esquema para las colecciones Task y User, respectivamente. También configuraremos una conexión de base de datos en <code>index.mjs</code> para asegurar que la configuración del esquema funcione correctamente.</p><p>No iré en detalle sobre los modelos y esquemas de Mongoose en este artículo porque están fuera de su alcance.</p><p>Cuando ejecutas el comando <code>node .</code> después de implementar los cambios en <code>02-setup-schema</code>, deberías de ver un resultado similar en la consola como en el fragmento de abajo:</p><pre><code class="language-bash">node .
You are running Node.js v22.13.1
Created user with id 679f1d7f73fbeaf23b2007df
Created task "Task title" for user with id "679f1d7f73fbeaf23b2007df"
</code></pre><p>Puedes ver las diferencias entre <code>01-setup</code> y <code>02-setup-schema</code> a través de la <a href="https://github.com/orimdominic/nodejs-test-runner-mongoose/compare/01-setup...02-setup-schema">diferencia 01-setup &lt;&gt; 02-setup-schema en Github</a>. </p><!--kg-card-begin: html--><h3 id="configurar-servicios">3. Configurar los Servicios</h3><!--kg-card-end: html--><p>Luego, creamos los archivos de servicio (<code>task/service.mjs</code> y <code>user/service.mjs</code>) en la rama <code>03-setup-services</code>. Ambos archivos actualmente contienen funciones vacías en el que escribiremos las pruebas más tarde. Estas funciones contendrán la lógica de negocio y también se comunicará con la base de datos. Estamos usando comentarios de <a href="https://jsdoc.app/">JSDoc</a> para escribir parámetros y regresar valores.</p><p>Haz clic en la <a href="https://github.com/orimdominic/nodejs-test-runner-mongoose/compare/01-setup...02-setup-schema">diferencia de 02-setup-schema &lt;&gt; 03-setup-services</a> para ver los cambios de código entre <code>02-setup-schema</code> y <code>03-setup-services</code>.</p><!--kg-card-begin: html--><h3 id="configurar-pruebas">4. Configurar las Pruebas</h3><!--kg-card-end: html--><p>En la rama <code>04-set-up-tests</code>, configuramos la base de código para ejecutar las pruebas. Creamos <code>test.setup.mjs</code> el cual contiene el código que será ejecutado antes de que cada archivo de prueba se ejecute.</p><p>En <code>test.setup.mjs</code>, la función <code>connect</code> crea un servidor de MongoDB en memoria y lo conecta con Mongoose para ejecutar las pruebas. La función <code>closeDatabase</code> cierra la conexión de la base de datos y limpia todos los recursos para liberar memoria.</p><p>Las funciones <code>connect</code> y <code>closeDatabase</code> se ejecutan en el hook <code>t.before</code> y en el hook <code>t.after</code> respectivamente. Esto asegura eso, antes que un archivo test se ejecute, una conexión de base de datos se establece a través <code>t.before</code>. Luego de que se hayan ejecutado las pruebas del archivo, la conexión de la base de datos se cae y los recursos usados se limpian a través de <code>t.after</code>.</p><p>En <code>package.json</code>, actualizaremos el script de npm <code>test</code> a <code>node --test --import ./test.setup.mjs</code>. Este comando asegura que Módulo Es <code>test.setup.mjs</code> se pre-cargue y se ejecute a través del comando <code>--import</code> del CLI antes de que cada archivo de prueba se ejecute.</p><p>Luego crearemos los archivos de prueba con pruebas vacías en las carpetas <code>__tests__</code> para <code>user</code> y <code>task</code>. Después de implementar los <a href="https://github.com/orimdominic/nodejs-test-runner-mongoose/compare/03-setup-services...04-set-up-tests">nuevos cambios en 04-set-up-tests</a>, ejecutar el script <code>test</code> con <code>npm run test</code> debería de mostrar la salida similar al fragmento de abajo:</p><pre><code class="language-bash">npm run test

&gt; nodejs-test-runner-mongoose@1.0.0 test
&gt; node --test --import ./test.setup.mjs

...

ℹ tests 8
ℹ suites 5
ℹ pass 8
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 941.768873
</code></pre><p>Todas las pruebas actualmente pasan porque no hay aserciones que fallen. Escribiremos las pruebas con aserciones en la siguiente sección.</p><!--kg-card-begin: html--><h3 id="escribir-pruebas">5. Escribir Pruebas</h3><!--kg-card-end: html--><p>Ahora es tiempo de escribir las pruebas para las funciones en los archivos de service en la rama <code>05-write-tests</code>. Estamos usando la librería de aserción de Node.js para asegurar que los valores regresados de las funciones sean lo que esperamos. Puedes ver las pruebas que hemos escrito cuando comparas <a href="https://github.com/orimdominic/nodejs-test-runner-mongoose/compare/04-set-up-tests...05-write-tests">las diferencias entre 04-set-up-tests y 05-write-tests</a>.</p><p>Cuando el script <code>tests</code> se ejecute, todas las pruebas fallan porque no hemos escritos las funciones en los archivos de service todavía. Debería de ver una salida similar al fragmento de abajo cuando ejecutes el script <code>test</code>:</p><pre><code class="language-bash">npm run test

&gt; nodejs-test-runner-mongoose@1.0.0 test
&gt; node --test --import ./test.setup.mjs

...

ℹ tests 8
ℹ suites 5
ℹ pass 0
ℹ fail 8
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 1202.031961
</code></pre><!--kg-card-begin: html--><h3 id="pasar-pruebas">6. Pasar las Pruebas</h3><!--kg-card-end: html--><p>En <code>06-pass-tests</code>, escribimos las funciones en los archivos de service que pasen las pruebas. Solamente 6 de 7 pruebas pasan cuando el script <code>test</code> se ejecuta porque salteamos la prueba para la función <code>getById</code> en <code>user/service.mjs</code> con <code>t.skip</code>. No hemos terminado la función <code>getById</code> en <code>user/service.mjs</code>. Supuse que podríamos dejarlo como ejercicio.</p><p>Cuando ejecutas el script <code>test</code>, deberías obtener una salida similar en la terminal como el de abajo:</p><pre><code class="language-bash">ℹ tests 7
ℹ suites 4
ℹ pass 6
ℹ fail 0
ℹ cancelled 0
ℹ skipped 1
ℹ todo 0
ℹ duration_ms 1287.564918
</code></pre><p>Puedes ver el código que escribimos para pasar las pruebas en los <a href="https://github.com/orimdominic/nodejs-test-runner-mongoose/compare/05-write-tests...06-pass-tests">cambios de código entre 05-write-tests y 06-pass-tests</a>.</p><!--kg-card-begin: html--><h3 id="usa-typescript-opcional">7. Usa TypeScript (Opcional)</h3><!--kg-card-end: html--><p>Si tu intención es ejecutar las pruebas con TypeScript, puedes cambiar a la rama <code>07-with-typescript</code>. Necesitas tener Node.js <code>&gt;=22.6.0</code> instalado porque estamos usando la opción <code>--experimental-strip-types</code> en el <code>test</code>. Para configurar las pruebas que se ejecuten con TypeScript, sigue los siguientes pasos:</p><ol><li>Instala TypeScript usando el comando <code>npm install typescript --save-dev</code> </li><li>Instala tsx usando el comando <code>npm install tsx</code></li><li>Crea un archivo predeterminado <code>tsconfig.json</code> en la raíz del proyecto usando el comando <code>npx tsc --init</code> </li></ol><p>En &nbsp;<code>package.json</code>, actualiza el script <code>test</code> a esto:</p><pre><code class="language-bash">"test": "node --test --experimental-strip-types --import tsx --import ./test.setup.mjs"
</code></pre><ul><li><a href="https://nodejs.org/docs/latest-v22.x/api/cli.html#--experimental-strip-types"><code>--experimental-strip-types</code></a> ayuda a eliminar tipos antes de cada archivo de prueba se ejecute.</li></ul><p>Pre-cargar <code>tsx</code> con el <code>--import</code> ayuda a ejecutar el archivo de TypeScript. Sin él, el ejecutor de pruebas no será capaz de encontrar archivos importados sin la extensión <code>.ts</code>. Por ejemplo, <code>user/model.ts</code> importado con el fragmento de código de abajo no será encontrado.</p><pre><code class="language-typescript">  import { UserModel } from "./model";
</code></pre><p>El resto de los <a href="https://github.com/orimdominic/nodejs-test-runner-mongoose/compare/06-pass-tests...07-with-typescript">cambios desde 06-pass-tests a 07-with-typescript</a> involucran actualizar los tipos, cambiar las extensiones de archivo de <code>.mjs</code> a <code>.ts</code> y actualizar las declaraciones import.</p><!--kg-card-begin: html--><h2 id="conclusion">Conclusión</h2><!--kg-card-end: html--><p>En esta guía, has aprendido cómo usar el ejecutor de pruebas incorporado de Node.js y por qué es frecuentemente una mejor elección sobre otras librerías y frameworks de pruebas. También has aprendido cómo usar mongodb-memory-server como un reemplazo de un servidor real de MongoDB, así también como por qué es una buena idea usarlo en vez de un servidor real de MongoDB para las pruebas.</p><p>Lo más importante, has aprendido cómo configurar y ejecutar las pruebas en Node.js usando el ejecutor de pruebas de Node.js y mongodb-memory-server. Ahora deberías de saber cómo configurar tus proyectos para que ejecuten las pruebas si usas TypeScript.</p><p>Si encuentras útil a este repositorio <a href="https://github.com/orimdominic/nodejs-test-runner-mongoose">nodejs-test-runner-mongoose</a>, por favor dale una estrella. Me anima mucho. Gracias.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Como iniciar la prueba unitaria de tu código JavaScript ]]>
                </title>
                <description>
                    <![CDATA[ Artículo original escrito por: Ondrej Polesny [https://www.freecodecamp.org/news/author/ondrej/]  Artículo original: How to Start Unit Testing Your JavaScript Code [https://www.freecodecamp.org/news/how-to-start-unit-testing-javascript/]  Traducido y adaptado por: Sil Zubikarai [/espanol/news/author/sil/] Todos sabemos que debemos escribir pruebas unitarias. Pero, es difícil saber donde comenzar y cuanto tiempo debemos dedicar a probar comparado a la ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/como-iniciar-la-prueba-unitaria-de-tu-codigo-javascript/</link>
                <guid isPermaLink="false">624f00b09a87f708bdd10885</guid>
                
                    <category>
                        <![CDATA[ pruebas unitarias ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Sil Zubikarai ]]>
                </dc:creator>
                <pubDate>Sun, 15 May 2022 19:10:02 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2022/05/ferenc-almasi-EWLHA4T-mso-unsplash-1.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong>Artículo original escrito por</strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong>:</strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong> </strong><a href="https://www.freecodecamp.org/news/author/ondrej/">Ondrej Polesny</a> <br><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong>Artículo original</strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong>:</strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong> </strong><a href="https://www.freecodecamp.org/news/how-to-start-unit-testing-javascript/">How to Start Unit Testing Your JavaScript Code</a><strong> </strong><br><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong>Traducido y adaptado por</strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong>:</strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong> </strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong><a href="https://www.freecodecamp.org/espanol/news/author/sil/">Sil Zubikarai</a></p><p>Todos sabemos que debemos escribir pruebas unitarias. Pero, es difícil saber donde comenzar y cuanto tiempo debemos dedicar a probar comparado a la implementación actual. Entonces ¿dónde comenzar? ¿Y se trata solo de probar el código o las pruebas unitarias tienen otros beneficios?</p><p>En este artículo, vamos a explicar los diferentes tipos de pruebas, y que beneficios las pruebas unitarias traen a los equipos de desarrolladores. Mostraré Jest, un marco de pruebas de JavaScript.</p><h2 id="diferentes-tipos-de-pruebas-"><strong>Diferentes tipos de pruebas.</strong></h2><p>Antes de sumergirnos en los detalles de las pruebas unitarias. Quiero &nbsp;hacer un recorrido rápido a los diferentes tipos de pruebas. A menudo hay cierta confusión &nbsp;a su alrededor y no estoy sorprendido. A menudo la línea entre ellos es bastante delgada.</p><h3 id="pruebas-unitarias"><strong>Pruebas Unitarias</strong></h3><p>Las pruebas unitarias solo prueban una sola parte de tu implementación. Una unidad. Sin dependencias, ni integraciones, ni detalles del framework. Son como un método que regresa un link en un lenguaje específico:</p><pre><code class="language-js">export function getAboutUsLink(language){
  switch (language.toLowerCase()){
    case englishCode.toLowerCase():
      return '/about-us';
    case spanishCode.toLowerCase():
      return '/acerca-de';
  }
  return '';
}</code></pre><h3 id="pruebas-de-integraci-n"><strong>Pruebas de integración</strong></h3><p>En cierto punto, tu código se comunica con una base de datos, el sistema de archivos u otro tercero. Incluso podría ser otro módulo en tu aplicación.</p><p>Esa pieza de implementación debe ser probada por las pruebas de integrador. Por lo general, tienen una configuración más complicada que implica preparar entornos de prueba, inicializando dependencias, etc.</p><h3 id="pruebas-funcionales"><strong>Pruebas Funcionales</strong></h3><p>Las pruebas unitarias y las pruebas de integración te dan la confianza que tu aplicación trabaja. Las pruebas Funcionales ven a la app &nbsp;desde el punto de vista del usuario y prueba que el sistema trabaja como es esperado.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2020/03/presentation.jpg" class="kg-image" alt="presentation" width="600" height="400" loading="lazy"></figure><p>En el diagrama de arriba, viste que las pruebas unitarias forman la gran base del conjunto de pruebas de aplicación. Por lo general, son pequeños, hay muchos de ellos, y sé ejecutados automáticamente.</p><p>Entonces ahora vamos a ver las pruebas unitarias en mayor detalle.</p><h2 id="-por-qu-te-debes-molestarte-en-escribir-pruebas-unitarias">¿Por qué te debes molestarte en escribir pruebas unitarias?</h2><p>Siempre que pregunto a desarrolladores si escriben prueban unitarias para su aplicación, ellos siempre me dicen: &nbsp;"No tengo tiempo para ellas" o "No las necesito, yo sé cómo trabaja"</p><p>Entonces sonrío educadamente y les digo lo que quiero decirles. La pruebas unitarias no se tratan solo de pruebas. También te ayudan de otras maneras, para que puedas:</p><p><strong>Confía en que tu código funciona</strong>. ¿Cuándo fue la última vez que cometiste un cambio en el código, &nbsp;fallo la compilación, y la mitad de tu aplicación dejo de trabajar? La mía fue la semana pasada.</p><p>Pero eso todavía está bien. El verdadero problema es cuando la compilación se realiza correctamente, el cambio es llevado, y tu aplicación empieza a ser inestable.</p><p>Cuando eso pasa, empiezas a perder confianza en tu código y eventualmente solo pedirás que tu aplicación funcione. Las pruebas unitarias te ayudarán a descubrir errores mucho antes y a ganar confianza.</p><p><strong>Tomar mejores decisiones de arquitectónicas.</strong> El código cambia, pero algunas decisiones sobre la plataforma, módulos, estructura, y otros cambios se necesitan hacer en tempranas etapas del proyecto.<br></p><p>Cuando empiezas a pensar acerca de las pruebas unitarias justo al inicio, le ayudara a estructurar mejor su código y lograr una separación adecuada de las preocupaciones. No tendrá la tentación de asignar múltiples responsabilidades a un solo bloques de código único, ya que serian una pesadilla para la prueba unitaria.</p><p><strong>Identifique la funcionalidad antes de codificar</strong>. Escribe la firma del método y comienza a implementarlo de inmediato. Ah, pero ¿qué debería suceder en caso de que un parámetro sea nulo? ¿Qué sucede si su valor está fuera del rango esperado o contiene demasiados caracteres? ¿Lanza una excepción o devuelve null?</p><p>Las pruebas unitarias ayudarán a descubrir todos los casos. Mira las preguntas otra vez y encontrarás exactamente que definirás tus casos de pruebas unitarias.</p><p>Estoy seguro de que hay muchos otros beneficios de escribir pruebas unitaria. Estos solo algunos de los que recuerdo por mi experiencia. Estos los he aprendido de la manera difícil.</p><h2 id="como-escribir-tu-primera-prueba-unitaria-de-javascript"><strong>Como escribir tu primera prueba unitaria de JavaScript</strong></h2><p>Pero vamos a regresar a JavaScript. Vamos a empezar con Jest, que es un marco de pruebas de JavaScript. Es una herramienta que permite realizar &nbsp;pruebas unitarias automáticas, proporciona &nbsp;cobertura de código, y nos permite simular fácilmente objetos. Jest también tiene una extensión para Visual Studio Code disponible <a href="https://marketplace.visualstudio.com/items?itemName=Orta.vscode">aquí</a>.</p><p>También hay otros marcos, si tú estás interesado, tú puedes revisarlos en <a href="https://www.browserstack.com/guide/top-javascript-testing-frameworks">este artículo</a>.</p><pre><code class="language-js">npm i jest --save-dev
</code></pre><p>Vamos a usar el método mencionado anteriormente <code>getAboutUsLink</code> como una implementación que queremos probar:</p><pre><code class="language-js">const englishCode = "en-US";
const spanishCode = "es-ES";
function getAboutUsLink(language){
    switch (language.toLowerCase()){
      case englishCode.toLowerCase():
        return '/about-us';
      case spanishCode.toLowerCase():
        return '/acerca-de';
    }
    return '';
}
module.exports = getAboutUsLink;
</code></pre><p>Puse esto en el archivo <code>index.js</code> . Podemos escribir pruebas en el mismo archivo, pero una buena práctica es separar las pruebas unitarias en archivo dedicado.</p><p>Los patrones de nomenclatura &nbsp;incluyen <code>{filename}.test.js</code> y <code>{filename}.spec.js</code>. Utilice el primero, <code>index.test.js</code>:</p><pre><code class="language-js">const getAboutUsLink = require("./index");
test("Returns about-us for english language", () =&gt; {
    expect(getAboutUsLink("en-US")).toBe("/about-us");
});
</code></pre><p>Primero, necesitamos importar la función que queremos probar. Cada prueba se definía como una invocación de &nbsp;función <code>test</code>. &nbsp;El primer parámetro es el nombre de la prueba para su referencia. El otro es una función de flecha donde llamamos a la función que queremos probar y especificamos que resultado esperamos. </p><p>En este caso, llamamos a la función <code>getAboutUsLink</code> con <code>en-US</code> como parámetro de lenguaje. Esperamos que el resultado sea <code>/about-us</code>.</p><p>Ahora podemos instalar el Jest CLI globalmente y ejecutar la prueba:</p><pre><code class="language-js">npm i jest-cli -g
jest
</code></pre><p>Si ve el error relacionado con la configuración, asegúrese de tener presente &nbsp;el archivo <code>package.json</code>. &nbsp;En ese caso que no lo hagas, genera uno usando <code>npm init</code>.</p><p>Debes ver algo como esto:</p><pre><code class="language-js"> PASS  ./index.test.js
  √ Returns about-us for english language (4ms)
  console.log index.js:15
    /about-us
Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        2.389s
</code></pre><p>¡Buen trabajo! Este fue la primera prueba unitaria simple JavaScript desde el principio al fin. Si tienes instalado la extensión Visual Studio Code, ejecutará la prueba automáticamente una vez salvado el archivo. Vamos a intentarlo extendiendo la prueba con esta línea:</p><pre><code class="language-js">expect(getAboutUsLink("cs-CZ")).toBe("/o-nas");
</code></pre><p>Una vez salvado el archivo, &nbsp;Jest te informará que la prueba ha fallado. Esto te ayuda a descubrir potenciales problemas, inclusive antes de cometer un cambio.</p><h2 id="probando-funcionalidad-avansada-y-servicios-de-simulaci-n"><strong>Probando funcionalidad avansada y servicios de simulación</strong></h2><p>En la vida real, los códigos &nbsp;de idioma para el método getAboutUsLink no serían constantes en el mismo archivo. Su valor se usa típicamente en todo el proyecto, por lo que se definirían en su propio módulo y se importarían a todas las funciones que las usan.</p><pre><code class="language-js">import { englishCode, spanishCode } from './LanguageCodes'
</code></pre><p>Puedes importar estas constantes dentro de la prueba de la misma manera. Pero la situación se complicaría si trabajas con objetos en lugar de simples constantes. Echa un vistazo a este método:</p><pre><code class="language-js">import { UserStore } from './UserStore'
function getUserDisplayName(){
  const user = UserStore.getUser(userId);
  return `${user.LastName}, ${user.FirstName}`;
}
</code></pre><p>Este método utiliza &nbsp;<code>UserStore</code> importado:</p><pre><code class="language-js">class User {
    getUser(userId){
        // logic to get data from a database
    }
    setUser(user){
        // logic to store data in a database
    }
}
let UserStore = new User();
export { UserStore }
</code></pre><p>En orden, para hacer una prueba unitaria de este método, necesitamos simular <code>UserStore</code>. Una simulación es un substituto del objeto original. Nos permite separar dependencias y datos reales de los métodos probados implementados justo como los dummies ayudaban a las pruebas de choquen de autos en lugar de personas reales.</p><p>Si no usamos el simulacro, estaríamos probando tanto esta función como la tienda. Eso sería una prueba de integración y probablemente tendríamos que simular una base de datos utilizados. </p><h3 id="simulaci-n-de-servicios">Simulación de servicios</h3><p>Para simular objetos, puede proporcionar una función de simulación o una simulación manual. Me centraré en esto último, ya que tengo un caso de uso simple y llanamente. Pero siéntase libre de <a href="https://jestjs.io/docs/en/mock-functions.html">echar un vistazo a otras posibilidades de simulación que Jest ofrece</a>.</p><pre><code class="language-js">jest.mock('./UserStore', () =&gt; ({
    UserStore: ({
        getUser: jest.fn().mockImplementation(arg =&gt; ({
            FirstName: 'Ondrej',
            LastName: 'Polesny'
        })),
        setUser: jest.fn()
    })
}));
</code></pre><p>Primero, necesitamos especificaciones que hemos simulado- el módulo <code>./UserStore</code>. &nbsp;Siguiente, necesitamos regresar la simulación que contiene todos los objetos exportados del módulo.</p><p>En esta muestra, es únicamente el objeto <code>User</code> nombrado <code>UserStore</code> &nbsp;con la función <code>getUser</code>. Pero con las implementaciones reales, la simulación podría ser mucho más larga. &nbsp;Cualquier función que no &nbsp;importe &nbsp;el resultado de la prueba unitaria puede ser fácilmente simulada con <code>jest.fn()</code>.</p><p>La prueba unitaria para la función <code>getUserDisplayName</code> es simular a la que hemos creado antes:</p><pre><code class="language-js">test("Returns display name", () =&gt; {
    expect(getUserDisplayName(1)).toBe("Polesny, Ondrej");
})
</code></pre><p>Tan pronto como he salvado el archivo, Jest me dice que ha pasado dos pruebas. Si tú estás ejecutando las pruebas manualmente, &nbsp;hazlo ahora y asegúrate que tienen el mismo resultado.</p><h3 id="informe-de-cobertura-de-c-digo">Informe de cobertura de código</h3><p>Ahora que sabemos como probar el código JavaScript, es bueno cubrir la mayor cantidad de código como sea posible con pruebas. Y eso es difícil de &nbsp;hacer. Al final, solo somos personas. Queremos que nuestras tareas y las pruebas unitarias generalmente producen una carga de trabajo no deseada que tendemos a pasar por alto. La cobertura de código es una herramienta que nos ayuda a combatir eso.</p><p>La cobertura de código te dirá que tan grande es la proporción de tu código, es cubierta por las pruebas unitarias. Tomemos, por ejemplo, mi primera prueba de unitaria comprobando la función <code>getAboutUsLink</code>:</p><pre><code class="language-js">test("Returns about-us for english language", () =&gt; {
   expect(getAboutUsLink("en-US")).toBe("/about-us");
});
</code></pre><p>Revisa el link en inglés, pero la versión en Español no se ha probado. La cobertura de código es 50%. La otra prueba unitaria es verificar la función <code>getDisplayName</code> a fondo y su cobertura de código es el 100%. En conjunto, la cobertura total de código es del 67%. Tenemos &nbsp;3 casos de uso para probar, pero nuestras pruebas solo cubren dos de ellas.</p><p>Para ver el reporte de cobertura de código, escribe el siguiente comando en la terminal:</p><pre><code class="language-js">jest --coverage
</code></pre><p>O, si tú estás usando Visual Studio Code con la extensión Jest, tú puedes ejecutar el comando (CTRL+SHIFT+P) <em><em>Jest: Toggle Coverage Overlay</em>. </em>Le mostrará justo en la &nbsp;implementación que líneas de código no están cubiertas por la prueba.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2020/03/code-coverage-inline.jpg" class="kg-image" alt="code-coverage-inline" width="600" height="400" loading="lazy"></figure><p>Ejecutando la revisión de cobertura, Jest también creará un reporte HTML. Encuéntralo en la carpeta del proyecto en <code>coverage/lcov-report/index.html</code>.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2020/03/code-coverage.jpg" class="kg-image" alt="code-coverage" width="600" height="400" loading="lazy"></figure><p>Ahora, no tengo que mencionar que debe esforzarse por obtener una cobertura de código del 100%, ¿verdad? :-)</p><h2 id="en-resumen"><strong>En resumen</strong></h2><p>En este artículo, muestra como empezar con las pruebas unitarias en JavaScript. Si bien es bueno que su cobertura de código brille al 100% en el informe, en realidad, no siempre es posible(significativamente) llegar ahí. El objetivo es permitir que las pruebas unitarias te ayuden a mantener tu código y de asegurarte de que siempre funcione como es previsto. Te permiten:</p><ul><li> claramente, define la implementación de los requerimientos.</li><li>diseñar mejor su código y separación de preocupaciones</li><li>descubrir los problemas que puede introducir con tus nuevos commits.</li><li> y darte la confianza de que tu código trabaja.</li></ul><p>El mejor lugar para empezar es la página &nbsp;<a href="https://jestjs.io/docs/en/getting-started">Getting started</a> en la documentación Jest así tú puedes probar estas prácticas por ti mismo.</p><p>¿Tienes tu propia experiencia con pruebas de código? Me encantaría escucharlo, déjamelo saber en twitter o únete a alguno de mis streams Twitch.</p> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
