Jest es una herramienta que nos ayuda a automatizar nuestras pruebas.
El entender el problema, es el 80% de la solución.
Hay que entender porque estamos usando Jest y como es que nos ayuda a resolver nuestro problema de pruebas.
Existen 4 definiciones en las pruebas que nos pueden ayudar a entender mejor esto.
Anomalía: es un comportamiento que no se espera dentro del sistema.
Defecto: Situación que se puede reproducir y se sabe que causa problemas al sistema.
Fallo: Incapacidad del sistema dentro de los márgenes conocidos.
Error: acción humana que genera desperfectos en el sistema.
Ejemplo
Muy bonitas las definiciones, pero, ¿qué saco yo de esto?
Pongamos este ejemplo:
Contamos con un despertador que todas las mañanas a las 9 AM suena su alarma, pero desde hace unos días ya no lo hace, eso es una anomalía, en caso de que hubiera llegado con una manecilla rota, seria defecto, si necesita luz para funcionar y por una tormenta se nos va la luz y ya no sirve, es fallo y por último si utilizas tu despertador para que te ayude a volver con tu ex, es un error.
Teniendo ya este panorama, Jest es una herramienta que nos ayuda a detectar anomalías o defectos, prevenir errores y minimizar los fallos de nuestro sistema.
Cuando instalamos vue test utils instalamos jest, así que ya tenemos esto listo. Ahora saltemos directo al código.
Anteriormente nos habíamos quedado con esto:
import { mount } from '@vue/test-utils' import App from '@/App.vue' const wrapper = mount(App) const vm = wrapper.vm console.log(vm.$data)
Ahora, agregaremos nuestra primera prueba con ayuda de Jest.
Para esto, vamos a crear un nuevo archivo llamado jestTest.js a la misma altura de nuestro archivo de pruebas.
Dentro de este archivo vamos a escribir las siguientes funciones:
function huevo() { return { estado: ['fresco'], color: '#000' } } function espinaca() { return { estado: 1, color: "verde" }
Y las exportamos:
module.exports = { huevo, espinaca };
Luego, las importamos en nuestro archivo de pruebas con esta línea:
import {huevo, espinaca} from "./jestTest";
Si hemos llegado hasta aquí, lo único que falta es escribir la prueba en sí.
Empezaremos con una función llamada describe() que recibe dos parámetros:
param1Tipo: String
Descripción: el nombre de nuestro set de pruebas, ojo que es set de pruebas, más no la prueba en sí.
param2Tipo: Function
Descripción: función que va a contener nuestras pruebas.
Se ve de esta manera:
describe('Se probará la calidad de los productos', ()=>{ //Escriba sus pruebas aquí });
Luego seguimos con la función llamada test() que recibe dos parámetros:
param1Tipo: String
Descripción: el nombre de nuestra prueba .
param2Tipo: Function
Descripción: función que va a contener nuestras validaciones para que pase la prueba.
Entonces quedaría algo así:
test('Calidad del huevo', () => { //escriba aquí sus validaciones }); test('Calidad de la espinaca', () => { //escriba aquí sus validaciones });
Para la parte de las pruebas, recordaremos que las pruebas unitarias, prueban piezas atómicas del código , mientras que las pruebas de integración, prueban procesos.
Por ahora solo tenemos unas piezas atómicas, no un proceso, así que sólo haremos unas pruebas unitarias.
Matchers
Jest trabaja con matchers, que son meramente funciones que nos permiten probar nuestro código de diferentes maneras.
Todos los matchers empiezan con la palabra expect así que cada vez que veas que una línea de código empieza con eso, significa que estamos accediendo a un matcher para hacer una prueba.
Hay múltiples matchers, pero para este ejemplo solo utilizaremos dos, .toBe y .toEqual
.toBe
Compara valores primitivos. Utiliza la función Object.is para hacer las validaciones, la cual es mucho más confiable que un ===.
Su sintáxis es:
expect(coso).toBe(valorEsperado)
Donde coso es lo que estamos probando.
.toEqual
Compara recursivamente los valores de las propiedades de la instancia del objeto enviado (esto se le conoce como "deep equality"). Utiliza de igual manera la función Object.is para hacer las validaciones.
Su sintáxis es:
expect(coso).toEqual(valorEsperado)
Donde coso es lo que estamos probando.
Hagamos una recapitulación de lo que hemos visto.
Ya sabemos que debemos tener nuestra función describe que es la que va a contener las pruebas.
Las validaciones para que pasen nuestras pruebas se ponen dentro de la función test().
Las pruebas individuales utilizan matchers para hacer sus validaciones pertinentes.
Vamos a usar 2 matchers para estas pruebas toBe y toEqual.
Dicho esto, dentro de nuestra función test de los huevos, escribimos lo siguiente:
expect(huevo().estado[0]).toBe('fresco')
Y en la de espinaca, esto:
expect(espinaca()).toEqual({ estado: 1, color: "verde" })
Cuidándonos al final, así:
describe('Se va a probar la calidad de los ingredientes',() => { test('Calidad del huevo', () => { expect(huevo().estado[0]).toBe('fresco') }); test('Calidad de la espinaca', () => { expect(espinaca()).toEqual({ estado: 1, color: "verde" }) }); })
Y por último en nuestra terminal, nos posicionamos en la carpeta del proyecto y escribimos:
`npm run test:unit`
Si todo lo hicimos bien, debería de salirnos algo así:
Felicidades, has hecho tu primera prueba en Jest.
Con las pruebas que acabamos de hacer, logramos comprobar la equidad sencilla de valores en los elementos y un deep equality para validar datos de tipo objeto.
Estas son funciones que vamos a seguir ocupando y que te van a servir más adelante.
Intenta alguna otra combinación de resultados y compártelos en los comentarios.
Sebastián Buitrago
Jose Daniel Barría Reyes
Lourdes Serrano
Juan Hernandez
Jose Barboza
Emiliano Kuyen Arturo Pacheco Montero
Demian Arenas
Carlos Eduardo Gomez García
Carlos Eduardo Gomez García
Brayan Stiven Castaño Zuluaga
Les recomiendo mucho instalar esta extension que les ahorra mucho codigo ya que las pruebas suelen ser repetitivas https://marketplace.visualstudio.com/items?itemName=andys8.jest-snippets
Ademas les recomiendo escriban esto en su settings.json
"typeAcquisition": { "include": ["jest"] }
lo cual les ayudara a que el editor reconozca las funciones de jest
Pd para abrir settings.json pueden hacer esto
ctrl + shift + p
y despues escriben json les debe aparecer esta opcion
Genial la clase, aqui unas anotaciones
describe(name, testSuite), donde name:String, testSuite:Function
test(name, test), donde name: String, test:Function
expect(value).matcher()
Jest trabaja con matchers, que son meramente funciones que nos permiten probar nuestro código de diferentes maneras. Hay múltiples matchers, pero en esta clase solo utilizaremos dos, .toBe y .toEqual
.toBe Compara valores primitivos. Utiliza la función Object.is para hacer las validaciones, la cual es mucho más confiable que un ===. .toEqual Compara recursivamente los valores de las propiedades de la instancia del objeto enviado (esto se le conoce como “deep equality”). Utiliza de igual manera la función Object.is para hacer las validaciones.
hola compañeros necesito ayuda con esto. no consigo pasar el test me sale este error
> test:unit
> vue-cli-service test:unit
FAIL tests/unit/example.spec.js
● Test suite failed to run
Configuration error:
Could not locate module @/components/HelloWorld.vue mapped as:
C:\Users\lourd\OneDrive\Escritorio\Vuedex\src\$1.
Please check your configuration for these entries:
{
"moduleNameMapper": {
"/^@\/(.*)$/": "C:\Users\lourd\OneDrive\Escritorio\Vuedex\src\$1"
},
"resolver": undefined
}
1 | import { shallowMount } from '@vue/test-utils'
> 2 | import HelloWorld from '@/components/HelloWorld.vue'
| ^
3 |
4 | describe('HelloWorld.vue', () => {
5 | it('renders props.msg when passed', () => {
at createNoMappedModuleFoundError (node_modules/jest-resolve/build/resolver.js:579:17)
at Object.<anonymous> (tests/unit/example.spec.js:2:1)
at TestScheduler.scheduleTests (node_modules/@jest/core/build/TestScheduler.js:333:13)
at runJest (node_modules/@jest/core/build/runJest.js:404:19)
at _run10000 (node_modules/@jest/core/build/cli/index.js:320:7)
at runCLI (node_modules/@jest/core/build/cli/index.js:173:3)
Test Suites: 1 failed, 1 total
Tests: 0 total
Snapshots: 0 total
Time: 0.939 s
Ran all test suites.
Espero que alguien me pueda ayudar a resolverlo. Gracias
Hice el de jest de react y no comprendi tanto el sentido desde test como en este caso, debo decir que a veces un poco de lectura es buena!!
interesante sencillo como comprobar si los resultados son los que espero
Este tipo de prueba es para probar los valores de datos iniciales cierto? pero que utilidad tiene en un ejemplo real?, lo que se prueba ahí es info "harcodeada", no termino de entender el caso de uso de este tipo de prueba, no son valores que vengan de api o dinamicos.
El valor del TDD es justo para verificar que el comportamiento de nuestra aplicación sea la correcta. Aunque sean datos hardcodeados, pueden mostrar casos de uso donde el sitio no responde de la manera correcta.
Existen diversos tipos de testing, desde integración hasta unit testing.
5 meses tarde pero... yo también me pregunte lo mismo cuando miraba los tests con Laravel, pero lo entendí y es que ese es el chiste, hardcodear, porque con esos datos que mandamos queremos que nos retorne un resultado esperado, y en este caso fue muy simple, pero de esta forma puedes evaluar una función entera y ver si esa función te está devolviendo lo que quieres que te devuelva, el testing sirve para evaluar que tus procesos están haciendo lo correcto y están devolviendo la data correcta
Increíble, en resumen, describe nos sirve para agrupar un grupo de funciones de test, y cada test es el que hace la validación correspondiente, y para esto nos ayuda Jest, el cual se instaló al instalar Vue Test Utils:D!
Entendido. Intenté que el test me arrojara algo nuevo y me logró indicar de manera clara lo que esperaba y lo que obtuvo.
Se probará la calidad de los productos √ Calidad del hevo (3ms) × Calidad de la espinaca (4ms) ● Se probará la calidad de los productos › Calidad de la espinaca expect(received).toEqual(expected) // deep equality Expected: {"color": "verde", "estado": 1} Received: [{"color": "verde", "estado": 1}, {"color": 3, "estado": 2}]