<?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: Gleycer Parra</title>
    <description>The latest articles on DEV Community by Gleycer Parra (@gparra).</description>
    <link>https://dev.to/gparra</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%2F47405%2Fc9442db5-5290-4b0e-9f5b-31efc6273c70.jpg</url>
      <title>DEV Community: Gleycer Parra</title>
      <link>https://dev.to/gparra</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/gparra"/>
    <language>en</language>
    <item>
      <title>¿Cómo configurar Jest en Angular?</title>
      <dc:creator>Gleycer Parra</dc:creator>
      <pubDate>Wed, 07 Oct 2020 14:27:25 +0000</pubDate>
      <link>https://dev.to/gparra/como-configurar-jest-en-angular-1mhm</link>
      <guid>https://dev.to/gparra/como-configurar-jest-en-angular-1mhm</guid>
      <description>&lt;h1&gt;
  
  
  ¿Por qué usar Jest en Angular?
&lt;/h1&gt;

&lt;p&gt;Para cualquiera que esté empezando en el mundo de las pruebas puede ser un tanto abrumador debido a que si bien tenemos mucha información disponible en la web acerca de cómo hacerlos, en el caso de Javascript tenemos diferentes opciones y sin un adentramiento en el mundillo, difícilmente podremos elegir basándonos en nuestro nivel y requerimientos.&lt;/p&gt;

&lt;p&gt;Jest es un marco de prueba de JavaScript mantenido por Facebook, Inc. con un enfoque en la simplicidad. Funciona con proyectos que utilizan: Babel, TypeScript, Node.js, React, Angular, Vue.js y Svelte. Su objetivo es funcionar de forma inmediata y sin configuración. &lt;a href="https://jestjs.io/" rel="noopener noreferrer"&gt;https://jestjs.io/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Jest nos permitirá ejecutar nuestras pruebas mucho más rápido y sin necesidad de un navegador y su API extiende de Jasmine, es decir que su sintaxis es muy similar y nos permitirá un sumergimiento rápido en su sencilla sintaxis.&lt;/p&gt;

&lt;h1&gt;
  
  
  Instalación
&lt;/h1&gt;

&lt;p&gt;Primero vamos a instalar jest, @types/jest para sus tipos y jest-preset-angular que es una librería que nos da una configuración preestablecida de Jest para Angular, por su puesto dejaré por acá el repositorio para que puedan ir a darle un vistazo. &lt;a href="https://github.com/thymikee/jest-preset-angular" rel="noopener noreferrer"&gt;https://github.com/thymikee/jest-preset-angular&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;npm install -D jest jest-preset-angular @types/jest&lt;/code&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Eliminar Karma y Jasmine
&lt;/h1&gt;

&lt;p&gt;Necesitamos deshacernos de aquellos paquetes que no necesitaremos y que nos puedan generar algún conflicto.&lt;br&gt;
&lt;code&gt;npm uninstall karma karma-chrome-launcher karma-coverage-istanbul-reporter karma-jasmine karma-jasmine-html-reporter @types/jasmine @types/jasminewd2 jasmine-core jasmine-spec-reporter&lt;/code&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Cabe destacar que esta guía es si deseas iniciar o migrar a Jest, en caso de que quieras mantener tanto Jasmine como Jest, la configuración se puede complicar y no es el objetivo de este post.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Luego de esto necesitamos eliminar el archivo test.ts que está dentro de la carpeta src y agregar algunos cambios en nuestro tsconfig.spect.json, tu archivo debe quedar similar a este a menos de que ya tengas configuraciones personalizadas, de cualquier forma fíjate en los comentarios:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
    "extends": "./tsconfig.json",
    "compilerOptions": {
        "baseUrl": "./src",
        "outDir": "./out-tsc/spec",
        "types": [
            "jest", //cambiar esta línea de jasmine a jest
            "node"
        ],
        "experimentalDecorators": true, // agregar
        "emitDecoratorMetadata": true, // agregar
        "paths": { // esta sección es en caso de que uses paths 
            "@app/*": [
                "app/*"
            ],
            "@env/*": [
                "environments/*"
            ]
        }
    },
    "files": [ // eliminar la referencia a test.ts ya que lo eliminamos
        "src/polyfills.ts"
    ],
    "include": [
        "src/**/*.spec.ts",
        "src/**/*.d.ts"
    ]
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Luego de esto debemos ir a nuestro angular.json en la sección architect eliminar la actual configuración de test:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;...
        "test": {
          "builder": "@angular-devkit/build-angular:karma",
          "options": {
            "main": "src/test.ts",
            "polyfills": "src/polyfills.ts",
            "tsConfig": "tsconfig.spec.json",
            "karmaConfig": "karma.conf.js",
            "assets": [
              "src/favicon.ico",
              "src/assets"
            ],
            "styles": [
              "src/styles.scss"
            ],
            "scripts": []
          }
        }
...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Configuraciones finales
&lt;/h1&gt;

&lt;p&gt;Luego de esto vamos a agregar el archivo setupJest.ts a la raíz de nuestro proyecto con el siguiente contenido:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import 'jest-preset-angular';
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Básicamente esto extiende la configuración para Jest de nuestra librería jest-preset-angular.&lt;/p&gt;

&lt;p&gt;Con esto solo nos quedaría configurar nuestro package.json y podremos comenzar a escribir nuestras pruebas usando Jest. Así que vamos a nuestro package.json y agregamos lo siguiente al final:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    "jest": {
        "preset": "jest-preset-angular",
        "roots": [
            "&amp;lt;rootDir&amp;gt;/src"
        ],
        "moduleNameMapper": { // este apartado es sólo si usas paths aliases
            "@app/(.*)$": "&amp;lt;rootDir&amp;gt;/src/app/$1",
            "@env/(.*)": "&amp;lt;rootDir&amp;gt;/src/environments/$1"
        },
        "setupFilesAfterEnv": [
            "&amp;lt;rootDir&amp;gt;/setupJest.ts"
        ],
        "testPathIgnorePatterns": [
            "&amp;lt;rootDir&amp;gt;/node_modules/",
            "&amp;lt;rootDir&amp;gt;/dist/",
            "&amp;lt;rootDir&amp;gt;/src/test.ts"
        ],
        "globals": {
            "ts-jest": {
                "tsConfig": "&amp;lt;rootDir&amp;gt;/tsconfig.spec.json",
                "stringifyContentPathRegex": "\\.html$"
            }
        }
    }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Ten en cuenta que el "moduleNameMapper" se agrega solo cuando usas paths aliases y debes configurarlo según tu configuración en tsconfig.spec.json.&lt;br&gt;
Luego modificamos nuestros scripts para pruebas&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;        "test": "jest",
        "test:coverage": "jest --coverage",
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Con esto configurado ya seríamos capaces de ejecutar nuestras pruebas usando&lt;br&gt;
&lt;code&gt;npm test&lt;/code&gt;&lt;br&gt;
y&lt;br&gt;
&lt;code&gt;npm test:coverage&lt;/code&gt; para obtener un reporte de cobertura de nuestras pruebas&lt;/p&gt;

&lt;h1&gt;
  
  
  Instando Jest Runner para vscode
&lt;/h1&gt;

&lt;p&gt;Esta genial extension para vscode nos permitirá correr nuestras pruebas de forma aislada, es decir podemos ejecutar sólo la que queremos desde el propio editor. Vamos a extensiones de vscode y buscamos Jest Runner, el primero de la siguiente imágen.&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%2Fi%2Ftpm1oqreo88iliz03dyc.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%2Fi%2Ftpm1oqreo88iliz03dyc.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Luego de esto en nuestras pruebas nos aparecen enlaces para correrlas o debug:&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%2Fi%2Fas34ku83vbkmbuyfhxug.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%2Fi%2Fas34ku83vbkmbuyfhxug.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Recomendaciones
&lt;/h1&gt;

&lt;p&gt;Esta guía fue solo para configurar Jest con Angular, si son tus primeros pasos te sentirás perdido en el desierto en este mundo de las pruebas. De cualquier forma voy a recomendar un repositorio que en lo personal me ayudó muchísimo para tener ideas generales de cómo debo probar mi código. &lt;a href="https://github.com/goldbergyoni/javascript-testing-best-practices" rel="noopener noreferrer"&gt;https://github.com/goldbergyoni/javascript-testing-best-practices&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Espero que este post les haya servido y cualquier detalle que se haya pasado por alto por favor déjalo en los comentarios, estaré atento a cualquier feedback. También si desean que haga más contenido acerca de pruebas, déjamelo saber y haré mi mejor esfuerzo por compartir el camino que he seguido.&lt;/p&gt;

</description>
      <category>jest</category>
      <category>angular</category>
      <category>jasmine</category>
      <category>test</category>
    </item>
  </channel>
</rss>
