Skip to content

Commit c0b8aaf

Browse files
committed
part 4a
1 parent 21fd0b9 commit c0b8aaf

File tree

4 files changed

+58
-81
lines changed

4 files changed

+58
-81
lines changed

src/content/4/en/part4.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,6 @@ lang: en
99
In this part, we will continue our work on the backend. Our first major theme will be writing unit and integration tests for the backend. After we have covered testing, we will take a look at implementing user authentication and authorization.
1010

1111
<i>Part updated 13th Feb 2024</i>
12-
- <i>Jest replaced with Node embedded testrunner</i>
12+
- <i>Jest replaced with Node embedded test runner</i>
1313

1414
</div>

src/content/4/en/part4a.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ Let's continue our work on the backend of the notes application we started in [p
1111

1212
### Project structure
1313

14-
**Note** this course material was written with version v20.11.0 of Node.js. Please make sure that your version of Node is at least as new as the version used in the material (you can check the version by running node -v in the command line).
14+
**Note**: this course material was written with version v20.11.0 of Node.js. Please make sure that your version of Node is at least as new as the version used in the material (you can check the version by running _node -v_ in the command line).
1515

1616
Before we move into the topic of testing, we will modify the structure of our project to adhere to Node.js best practices.
1717

@@ -407,7 +407,7 @@ The nature of VS Code bleeding into how you write your code is probably not idea
407407
408408
### Exercises 4.1.-4.2.
409409
410-
**Note** this course material was written with version v20.11.0 of Node.js. Please make sure that your version of Node is at least as new as the version used in the material (you can check the version by running node -v in the command line).
410+
**Note**: this course material was written with version v20.11.0 of Node.js. Please make sure that your version of Node is at least as new as the version used in the material (you can check the version by running _node -v_ in the command line).
411411
412412
In the exercises for this part, we will be building a <i>blog list application</i>, that allows users to save information about interesting blogs they have stumbled across on the internet. For each listed blog we will save the author, title, URL, and amount of upvotes from users of the application.
413413
@@ -601,7 +601,7 @@ Running this test results in the following error message:
601601
602602
![terminal output shows failure from npm test](../../images/4/2new.png)
603603
604-
Let output from the npm test with _average_ function, into a new file <i>tests/average.test.js</i>.
604+
Let's put the tests for the _average_ function, into a new file called <i>tests/average.test.js</i>.
605605
606606
```js
607607
const { test, describe } = require('node:test')
@@ -673,7 +673,7 @@ test('of empty array is zero', () => {
673673
674674
### Exercises 4.3.-4.7.
675675
676-
Let's create a collection of helper functions that are best suited for working with the described sections of the blog list. Create the functions into a file called <i>utils/list_helper.js</i>. Write your tests into an appropriately named test file under the <i>tests</i> directory.
676+
Let's create a collection of helper functions that are best suited for working with the describe sections of the blog list. Create the functions into a file called <i>utils/list_helper.js</i>. Write your tests into an appropriately named test file under the <i>tests</i> directory.
677677
678678
#### 4.3: Helper Functions and Unit Tests, step 1
679679

src/content/4/es/part4.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ lang: es
88

99
En esta parte, continuaremos nuestro trabajo en el backend. Nuestro primer tema principal será escribir pruebas de unidad e integración para el backend. Una vez que hayamos cubierto las pruebas, analizaremos la implementación de la autenticación y autorización de usuario.
1010

11-
<i>Parte actualizada el 22 de enero de 2023</i>
12-
- <i>No hay cambios importantes</i>
11+
<i>Parte actualizada el 13 de Febrero de 2024</i>
12+
- <i>Jest reemplazado con el test runner integrado de Node</i>
1313

1414
</div>

src/content/4/es/part4a.md

Lines changed: 51 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@ Continuemos nuestro trabajo en el backend de la aplicación de notas que comenza
1111

1212
### Estructura del proyecto
1313

14-
Antes de pasar al tema de las pruebas, modificaremos la estructura de nuestro proyecto para cumplir con las mejores prácticas de Node.js.
14+
**Nota**: el material de este curso fue escrito con la version v20.11.0. Por favor asegúrate de que tu version de Node es al menos tan nueva como la version utilizada en el material (puedes chequear la version al ejecutar _node -v_ en la linea de comandos).
15+
16+
Antes de pasar al tema de las pruebas, modificaremos la estructura de nuestro proyecto para cumplir con las mejores prácticas de Node.js.
1517

1618
Después de realizar los cambios que explicaremos a continuación, terminaremos con la siguiente estructura:
1719

@@ -405,6 +407,8 @@ Esta característica de VS Code afectando la forma en que escribes tu código pr
405407
406408
### Ejercicios 4.1.-4.2.
407409
410+
**Nota**: el material de este curso fue escrito con la version v20.11.0. Por favor asegúrate de que tu version de Node es al menos tan nueva como la version utilizada en el material (puedes chequear la version al ejecutar _node -v_ en la linea de comandos).
411+
408412
En los ejercicios de esta parte, crearemos una <i>aplicación de lista de blogs</i>, que permite a los usuarios guardar información sobre blogs interesantes con los que se han encontrado en Internet. Para cada blog listado, guardaremos el autor, el título, la URL y la cantidad de votos positivos de los usuarios de la aplicación.
409413
410414
#### 4.1 Lista de Blogs, paso 1
@@ -504,19 +508,12 @@ module.exports = {
504508
505509
> La función _average_ usa el método de array [reduce](https://developer.mozilla.org/es/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce). Si el método aún no te resulta familiar, ahora es un buen momento para ver los primeros tres videos de la serie [Functional Javascript](https://www.youtube.com/watch?v=BMUiFMZr7vk&list=PL0zVEGEvSaeEd9hlmCXrk5yUyqUag-n84) en Youtube.
506510
507-
Hay muchas librerías de prueba diferentes o <i>ejecutores de prueba</i> disponibles para JavaScript. En este curso utilizaremos una librería de pruebas desarrollada y utilizada internamente por Facebook llamada [jest](https://jestjs.io/), que se asemeja al rey anterior de las librerías de prueba de JavaScript [Mocha](https://mochajs.org/).
508-
509-
Jest es una opción natural para este curso, ya que funciona bien para probar backends y brilla cuando se trata de probar aplicaciones React.
510-
511-
> <i>**Usuarios de Windows:**</i> Jest puede no funcionar si la ruta del directorio del proyecto contiene un directorio que tiene espacios en su nombre.
511+
Hay un gran número de librerías de pruebas, o <i>test runners</i>, disponibles para JavaScript.
512+
El antiguo rey de las librerías de pruebas es [Mocha](https://mochajs.org/), que fue reemplazado hace unos años por [Jest](https://jestjs.io/). Un recién llegado a las librerías es [Vitest](https://vitest.dev/), que se presenta como una nueva generación de librerías de pruebas.
512513
513-
Dado que las pruebas solo se ejecutan durante el desarrollo de nuestra aplicación, instalaremos <i>jest</i> como una dependencia de desarrollo con el comando:
514+
Hoy en día, Node también tiene una librería de pruebas integrada [node:test](https://nodejs.org/docs/latest/api/test.html), que se adapta bien a las necesidades del curso.
514515
515-
```bash
516-
npm install --save-dev jest
517-
```
518-
519-
Definamos el <i>script npm _test_</i> para ejecutar pruebas con Jest y para informar sobre la ejecución de la prueba con el estilo <i>verbose (detallado)</i>:
516+
Definamos el <i>script npm _test_</i> para ejecutar pruebas:
520517
521518
```bash
522519
{
@@ -529,62 +526,44 @@ Definamos el <i>script npm _test_</i> para ejecutar pruebas con Jest y para info
529526
"deploy:full": "npm run build:ui && npm run deploy",
530527
"logs:prod": "fly logs",
531528
"lint": "eslint .",
532-
"test": "jest --verbose" // highlight-line
529+
"test": "node --test" // highlight-line
533530
},
534531
//...
535532
}
536533
```
537534
538-
Jest requiere que especifiquemos que el entorno de ejecución es Node. Esto se puede hacer agregando lo siguiente al final de <i>package.json</i>:
539-
540-
```js
541-
{
542-
//...
543-
"jest": {
544-
"testEnvironment": "node"
545-
}
546-
}
547-
```
548-
549535
Creemos un directorio separado para nuestras pruebas llamado <i>tests</i> y creemos un nuevo archivo llamado <i>reverse.test.js</i> con el siguiente contenido:
550536
551537
```js
538+
const { test } = require('node:test')
539+
const assert = require('node:assert')
540+
552541
const reverse = require('../utils/for_testing').reverse
553542

554543
test('reverse of a', () => {
555544
const result = reverse('a')
556545

557-
expect(result).toBe('a')
546+
assert.strictEqual(result, 'a')
558547
})
559548

560549
test('reverse of react', () => {
561550
const result = reverse('react')
562551

563-
expect(result).toBe('tcaer')
552+
assert.strictEqual(result, 'tcaer')
564553
})
565554

566-
test('reverse of releveler', () => {
567-
const result = reverse('releveler')
555+
test('reverse of saippuakauppias', () => {
556+
const result = reverse('saippuakauppias')
568557

569-
expect(result).toBe('releveler')
558+
assert.strictEqual(result, 'saippuakauppias')
570559
})
571560
```
572561
573-
La configuración de ESLint que agregamos al proyecto en la parte anterior se queja de los comandos _test_ y _expect_ en nuestro archivo de prueba, ya que la configuración no permite <i>globals</i>. Eliminemos las quejas agregando <i>"jest": true</i> a la propiedad <i>env</i> en el archivo <i>.eslintrc.js</i>.
562+
En la primera linea, el archivo de prueba importa la función a ser probada y la asigna a una variable llamada _reverse_:
574563
575-
```js
576-
module.exports = {
577-
'env': {
578-
'commonjs': true,
579-
'es2021': true,
580-
'node': true,
581-
'jest': true, // highlight-line
582-
},
583-
// ...
584-
}
585-
```
564+
La prueba define la palabra clave _test_ y la librería [assert](https://nodejs.org/docs/latest/api/assert.html), que es utilizada por las pruebas para verificar los resultados de las funciones bajo prueba.
586565
587-
En la primera linea, el archivo de prueba importa la función a ser probada y la asigna a una variable llamada _reverse_:
566+
En la siguiente fila, el archivo de prueba importa la función a ser probada y la asigna a una variable llamada _reverse_:
588567
589568
```js
590569
const reverse = require('../utils/for_testing').reverse
@@ -596,55 +575,59 @@ Los casos de prueba individual se definen con la función _test_. El primer par
596575
() => {
597576
const result = reverse('react')
598577

599-
expect(result).toBe('tcaer')
578+
assert.strictEqual(result, 'tcaer')
600579
}
601580
```
602581
603-
Primero, ejecutamos el código que se va a probar, es decir, generamos un reverso para la cadena <i>react</i>. Luego, verificamos los resultados con la función [expect](https://jestjs.io/es-ES/docs/expect#expectvalue). Expect envuelve el valor resultante en un objeto que ofrece una colección de funciones <i>matcher</i>, que se pueden usar para verificar la corrección del resultado. Dado que en este caso de prueba estamos comparando dos cadenas, podemos usar el matcher [toBe](https://jestjs.io/es-ES/docs/expect#tobevalue).
582+
Primero, ejecutamos el código que se va a probar, es decir, generamos un reverso para el string <i>react</i>. Luego, verificamos los resultados con el método [strictEqual](https://nodejs.org/docs/latest/api/assert.html#assertstrictequalactual-expected-message) de la librería [assert](https://nodejs.org/docs/latest/api/assert.html).
604583
605584
Como se esperaba, todas las pruebas pasan:
606585
607-
![salida de terminal para npm test con todas las pruebas pasando](../../images/4/1x.png)
586+
![salida de terminal para npm test con todas las pruebas pasando](../../images/4/1new.png)
608587
609-
Jest espera por defecto que los nombres de los archivos de prueba contengan <i>.test</i>. En este curso, seguiremos la convención de nombrar nuestros archivos de prueba con la extensión <i>.test.js</i>.
588+
La librería node:test espera por defecto que los nombres de los archivos de prueba contengan <i>.test</i>. En este curso, seguiremos la convención de nombrar nuestros archivos de prueba con la extensión <i>.test.js</i>.
610589
611-
Jest tiene excelentes mensajes de error, rompamos la prueba para demostrar esto:
590+
Vamos a romper el test:
612591
613592
```js
614593
test('reverse of react', () => {
615594
const result = reverse('react')
616595

617-
expect(result).toBe('tkaer')
596+
assert.strictEqual(result, 'tkaer')
618597
})
619598
```
620599
621600
Ejecutar esta prueba da como resultado el siguiente mensaje de error:
622601
623-
![salida de terminal muestra error de npm test](../../images/4/2x.png)
602+
![salida de terminal muestra error de npm test](../../images/4/2new.png)
624603
625-
Agreguemos algunas pruebas para la función _average_, en un nuevo archivo <i>tests/average.test.js</i>.
604+
Pongamos las pruebas para la función _average_, en un nuevo archivo llamado <i>tests/average.test.js</i>.
626605
627606
```js
607+
const { test, describe } = require('node:test')
608+
609+
// ...
610+
628611
const average = require('../utils/for_testing').average
629612

630613
describe('average', () => {
631614
test('of one value is the value itself', () => {
632-
expect(average([1])).toBe(1)
615+
assert.strictEqual(average([1]), 1)
633616
})
634617

635618
test('of many is calculated right', () => {
636-
expect(average([1, 2, 3, 4, 5, 6])).toBe(3.5)
619+
assert.strictEqual(average([1, 2, 3, 4, 5, 6]), 3.5)
637620
})
638621

639622
test('of empty array is zero', () => {
640-
expect(average([])).toBe(0)
623+
assert.strictEqual(average([]), 0)
641624
})
642625
})
643626
```
644627
645-
La prueba revela que la función no funciona correctamente con una matriz vacía (esto se debe a que en JavaScript dividir por cero da como resultado <i>NaN</i>)
628+
La prueba revela que la función no funciona correctamente con un array vacío (esto se debe a que en JavaScript dividir por cero da como resultado <i>NaN</i>)
646629
647-
![salida de terminal mostrando error de jest para prueba con matriz vacía](../../images/4/3.png)
630+
![salida de terminal mostrando array vacío falla](../../images/4/3new.png)
648631
649632
Arreglar la función es bastante fácil:
650633
@@ -660,7 +643,7 @@ const average = array => {
660643
}
661644
```
662645
663-
Si la longitud de la matriz es 0, devolvemos 0, y en todos los demás casos usamos el método _reduce_ para calcular el promedio.
646+
Si la longitud del array es 0, devolvemos 0, y en todos los demás casos usamos el método _reduce_ para calcular el promedio.
664647
665648
Hay algunas cosas a tener en cuenta sobre las pruebas que acabamos de escribir. Definimos un bloque <i>describe</i> alrededor de las pruebas al que se le dio el nombre _average_:
666649
@@ -670,17 +653,17 @@ describe('average', () => {
670653
})
671654
```
672655
673-
Se pueden usar bloques de descripción para agrupar pruebas en colecciones lógicas. La salida de prueba de Jest también usa el nombre del bloque describe:
656+
Se pueden usar bloques de descripción para agrupar pruebas en colecciones lógicas. La salida de prueba también usa el nombre del bloque describe:
674657
675-
![npm test mostrando bloques describe](../../images/4/4x.png)
658+
![npm test mostrando bloques describe](../../images/4/4new.png)
676659
677660
Como veremos más adelante, los bloques <i>describe</i> son necesarios cuando queremos ejecutar algunas operaciones de instalación o desmontaje compartidas para un grupo de pruebas.
678661
679662
Otra cosa a tener en cuenta es que escribimos las pruebas de una manera bastante compacta, sin asignar la salida de la función que se está probando a una variable:
680663
681664
```js
682665
test('of empty array is zero', () => {
683-
expect(average([])).toBe(0)
666+
assert.strictEqual(average([]), 0)
684667
})
685668
```
686669
@@ -690,11 +673,11 @@ test('of empty array is zero', () => {
690673
691674
### Ejercicios 4.3.-4.7.
692675
693-
Creemos una colección de funciones auxiliares que están destinadas a ayudar a lidiar con la lista de blogs. Cree las funciones en un archivo llamado <i>utils/list_helper.js</i>. Escriba sus pruebas en un archivo de prueba con el nombre apropiado en el directorio <i>tests</i>.
676+
Creemos una colección de funciones auxiliares que estén destinadas a trabajar con las secciones describe de la lista de blogs. Crea las funciones en un archivo llamado <i>utils/list_helper.js</i>. Escribe tus pruebas en un archivo de prueba con el nombre apropiado en el directorio <i>tests</i>.
694677
695678
#### 4.3: Funciones Auxiliares y Pruebas Unitarias, paso 1
696679
697-
Primero define una función _dummy_ que reciba una matriz de publicaciones de blog como parámetro y siempre devuelva el valor 1. El contenido del archivo <i>list_helper.js</i> en este punto debe ser el siguiente:
680+
Primero define una función _dummy_ que reciba un array de publicaciones de blog como parámetro y siempre devuelva el valor 1. El contenido del archivo <i>list_helper.js</i> en este punto debe ser el siguiente:
698681
699682
```js
700683
const dummy = (blogs) => {
@@ -709,13 +692,15 @@ module.exports = {
709692
Verifica que tu configuración de prueba funcione con la siguiente prueba:
710693
711694
```js
695+
const { test, describe } = require('node:test')
696+
const assert = require('node:assert')
712697
const listHelper = require('../utils/list_helper')
713698

714699
test('dummy returns one', () => {
715700
const blogs = []
716701

717702
const result = listHelper.dummy(blogs)
718-
expect(result).toBe(1)
703+
assert.strictEqual(result, 1)
719704
})
720705
```
721706
@@ -744,22 +729,14 @@ describe('total likes', () => {
744729

745730
test('when list has only one blog, equals the likes of that', () => {
746731
const result = listHelper.totalLikes(listWithOneBlog)
747-
expect(result).toBe(5)
732+
assert.strictEqual(result, 5)
748733
})
749734
})
750735
```
751736
752-
Si definir tu propia lista de datos de prueba de blogs es demasiado trabajo, puedes usar la lista ya hecha [aquí](https://raw.githubusercontent.com/fullstack-hy2020/misc/master/blogs_for_test.md).
753-
754-
Es probable que tenga problemas al escribir pruebas. Recuerda las cosas que aprendimos sobre [depuración](/es/part3/guardando_datos_en_mongo_db#depuracion-en-aplicaciones-de-node) en la parte 3. Puedes imprimir cosas en la consola con _console.log_ incluso durante la ejecución de la prueba. Incluso es posible usar el depurador mientras se ejecutan las pruebas, puedes encontrar instrucciones para eso [aquí](https://jestjs.io/es-ES/docs/troubleshooting).
755-
756-
**NB:** si alguna prueba falla, entonces se recomienda ejecutar solo esa prueba mientras estás solucionando el problema. Puedes ejecutar una única prueba con el método [only](https://jestjs.io/es-ES/docs/api#testonlyname-fn-tiempo).
737+
Si definir tu propia lista de datos de prueba de blogs es demasiado trabajo, puedes usar la lista ya hecha [aquí](https://github.com/fullstack-hy2020/misc/blob/master/blogs_for_test.md).
757738
758-
Otra forma de ejecutar una sola prueba (o bloque de descripción) es especificar el nombre de la prueba que se ejecutará con la bandera [-t](https://jestjs.io/es-ES/docs/cli):
759-
760-
```js
761-
npm test -- -t 'when list has only one blog, equals the likes of that'
762-
```
739+
Es probable que tengas problemas al escribir pruebas. Recuerda las cosas que aprendimos sobre [depuración](/es/part3/guardando_datos_en_mongo_db#depuracion-en-aplicaciones-de-node) en la parte 3. Puedes imprimir cosas en la consola con _console.log_ incluso durante la ejecución de la prueba.
763740
764741
#### 4.5*: Funciones Auxiliares y Pruebas Unitarias, paso 3
765742
@@ -775,7 +752,7 @@ El valor devuelto por la función podría tener el siguiente formato:
775752
}
776753
```
777754
778-
**NB** cuando estás comparando objetos, el método [toEqual](https://jestjs.io/es-ES/docs/expect#toequalvalue) es probablemente lo que debas usar, ya que el método [toBe](https://jestjs.io/es-ES/docs/expect#tobevalue) intenta verificar que los dos valores sean el mismo valor, y no solo que contengan las mismas propiedades.
755+
**NB** cuando estás comparando objetos, el método [deepStrictEqual](https://nodejs.org/api/assert.html#assertdeepstrictequalactual-expected-message) es probablemente lo que debas usar, [strictEqual](https://nodejs.org/api/assert.html#assertstrictequalactual-expected-message) intenta verificar que los dos valores sean el mismo valor, y no solo que contengan las mismas propiedades. Por diferencias entre varios módulos de aserción de funciones, puedes referirte a [esta respuesta Stack Overflow](https://stackoverflow.com/a/73937068/15291501).
779756
780757
Escribe las pruebas para este ejercicio dentro de un nuevo bloque <i>describe</i>. Haz lo mismo con los ejercicios restantes también.
781758

0 commit comments

Comments
 (0)