Bienvenida e Introducción

1

¿Qué son las pruebas unitarias?

2

¿Por qué hacer pruebas unitarias?

Creando un framework de pruebas básico

3

Mi primera prueba unitaria en JavaScript

4

Las funciones expect() y it()

5

Organizando el código para correr en la web

6

Organizando el código para correr utilizando nodejs

Análisis estático de código

7

Herramientas de análisis estático de código

8

ESLint: Agregando alertas a nuestro código con ECMA Script

9

Herramientas de corrección de estilo

10

Herramientas de tipado

Trabajando con Jasmine en el frontend

11

Profundización en SpyOn: Comandos más utilizados y cómo ponerlos a prueba

12

Configurar un ambiente de trabajo para trabajar con el framework jasmine

13

Configurar Jasmine utilizando Node.js

14

Primer set de pruebas con Jasmine

15

Diccionario Jasmine

Probando Nodejs apps con Jasmine

16

Introducción al módulo de testing del lado del servidor

17

Configurando el proyecto Jasmine utilizando npm

18

Agregando Plugins a Jasmine

19

Configurando nuestro reporter

20

Pruebas en el servidor: Verificando un status 200 en GET

21

Pruebas en el servidor: Probando el método GET y Reto con FindByID

22

Pruebas en el servidor: Probando el método POST (request to server)

23

Pruebas en el servidor: Probando el método POST (request to PDF)

Probando Angular apps con Jasmine

24

Tipos de pruebas

25

Pruebas en el frontend: Probando el componente principal (App)

26

Configurando los ciclos de vida

27

Creando las pruebas del formulario: Configuración

28

Creando las pruebas necesarias para un formulario. (Primeras pruebas)

29

Probando el caso de exito al guardar un elemento en el servidor.

30

Trabajando con event emitters

31

Testeando ngZone y navegación.

32

Configurando el TestBed de el componente PINs

33

Creando un espia sobre el objecto window

Pruebas de integración de Angular apps con Jasmine

34

Ejecutando funciones a través de eventos en el template

35

Probando la navegación

36

Probando servicios con HTTP

37

Completando las pruebas del servicio HTTP

38

Cierre del curso

Aprende todo un fin de semana sin pagar una suscripción 🔥

Aprende todo un fin de semana sin pagar una suscripción 🔥

Regístrate

Comienza en:

3D
20H
50M
48S
Curso de Unit Testing para MEAN con Jasmine

Curso de Unit Testing para MEAN con Jasmine

Cristian Daniel Marquez Barrios

Cristian Daniel Marquez Barrios

Diccionario Jasmine

15/38

Lectura

Esta lectura te servirá de referencia para las cosas que puedes hacer con Jasmine:

...

Regístrate o inicia sesión para leer el resto del contenido.

Aportes 6

Preguntas 1

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

o inicia sesión.

Se confunde un poco con todo en el mismo bloque de código, acá un edit
Prueba negativa

expect(false).not.toBe(true); comparación con ===, ejemplo: 1 === 1 1 !== '1'

Igualdad completa:

expect(thing).toBe(realThing);

El valor no es undefined

expect(result).toBeDefined();

El valor actual es falso, ejemplo:0, ‘’, false

expect(result).toBeFalsy();

El valor actual es verdadero, ejemplo: ‘sd’, 1, true

expect(thing).toBeTruthy();

El valor actual es mayor al esperado

expect(result).toBeGreaterThan(3);

El valor actual es mayor o igual al esperado

expect(result).toBeGreaterThanOrEqual(25);

El valor actual es menor al esperado

expect(result).toBeLessThan(0);

El valor actual es menor o igual al esperado

expect(result).toBeLessThanOrEqual(123);

El valor actual es NaN

expect(thing).toBeNaN();

El valor actual es -Infinity

expect(thing).toBeNegativeInfinity();

El valor actual es Infinity

expect(thing).toBePositiveInfinity();

El valor actual es null

expect(result).toBeNull();

El valor actual continue una cadena. Ejemplo:

 'Hola mundo'.toContain('Hola') // true
['Hola', 'mundo'].toContain('Hola') // true
expect(array).toContain(anElement); expect(string).toContain(substring);

El valor actual es igual utilizando una comparación profunda

expect(bigObject).toEqual({"foo": ['bar', 'baz']});

El espía fue llamado

expect(mySpy).toHaveBeenCalled(); expect(mySpy).not.toHaveBeenCalled();

El espía fue llamado antes que otro

expect(mySpy).toHaveBeenCalledBefore(otherSpy);

El espía fue llamado n veces:

expect(mySpy).toHaveBeenCalledTimes(3);

El espía fue llamado con los siguientes parámetros

expect(mySpy).toHaveBeenCalledWith('foo', 'bar', 2);

Verificar si un elemento tiene una clase

const el = document.createElement('div');
el.className = 'foo bar baz';
expect(el).toHaveClass('bar');

El valor actual comparado con una expresión regular

expect("my string").toMatch(/string$/); 
expect("other string").toMatch("her");

Ciclos de vida

describe("Component", () => {
  // Shared variables
  var foo = 0;
beforeAll(() => {})
  beforeEach(() => {})
  afterEach(() => {})
  afterAll(() => {})
});
Deshabilitando pruebas
xdescribe("A spec", () => {
  it("waiting to be enable", function() {
    expect(true).toEqual(true);
  });
});
describe("A spec", () => {
  it("this run", () => {
    expect(true).toEqual(true);
  });
  xit("this is skipped", () => {
    expect(true).toEqual(true);
  });
});

Utilizando spyOn

describe('A spy', () => {
  let foo,
    bar = null;
  beforeEach(() => {
    foo = {
      setBar: value => {
        bar = value;
      },
    };
    spyOn(foo, 'setBar');
    foo.setBar(123);
    foo.setBar(456, 'another param');
  });
  it('tracks that the spy was called', () => {
    expect(foo.setBar).toHaveBeenCalled();
  });
  it('tracks that the spy was called x times', () => {
    expect(foo.setBar).toHaveBeenCalledTimes(2);
  });
  it('tracks all the arguments of its calls', () => {
    expect(foo.setBar).toHaveBeenCalledWith(123);
    expect(foo.setBar).toHaveBeenCalledWith(456, 'another param');
  });
});

Crear espía cuando desconocemos si la función existe

describe("Create a 'bare' spy", () => {
  let notSure;
  beforeEach(function() {
    notSure = jasmine.createSpy('notSure');
    notSure("I", "am", "a", "spy");
  });
  it("tracks that the spy was called", function() {
    expect(notSure).toHaveBeenCalled();
  });
});

Creando multiples espías en un mismo objeto

describe("Multiple spies", () => {
  const tape;
  beforeEach(() => {
    tape = jasmine.createSpyObj('tape', ['play', 'pause', 'stop']);
    tape.play();
      tape.pause();
      tape.rewind(0);
    });
  it("creates spies for each requested function", () => {
    expect(tape.play).toBeDefined();
    expect(tape.pause).toBeDefined();
    expect(tape.stop).toBeDefined();
  });
});
Verificar una propiedad de un objeto
describe("jasmine.objectContaining", () => {
  let foo;
  beforeEach(() => {
    foo = {
      a: 1,
      b: 2,
      bar: "baz"
    };
  });
  it("matches objects with the expect key/value pairs", () => {
    expect(foo).toEqual(jasmine.objectContaining({
      bar: "baz"
    }));
    expect(foo).not.toEqual(jasmine.objectContaining({
      c: 37
    }));
  });
});

Verificar una propiedad dentro de un objeto pasado como parámetro a una función

describe('jasmine.objectContaining', () => {
  it('is useful for comparing arguments', () => {
    const callback = jasmine.createSpy('callback');
    callback({
      bar: 'baz',
    });
    expect(callback).toHaveBeenCalledWith(
      jasmine.objectContaining({
        bar: 'baz',
      })
    );
  });
});

Verificar un valor dentro de un arreglo

describe("jasmine.arrayContaining", () => {
  let foo;
  beforeEach(function() {
    foo = [1, 2, 3, 4];
  });
  it("matches arrays with some of the values", () => {
    expect(foo).toEqual(jasmine.arrayContaining([3, 1]));
    expect(foo).not.toEqual(jasmine.arrayContaining([6]));
  });
});

Verificar un valor dentro de un arreglo pasado como parámetro a una función

describe('jasmine.arrayContaining', () => {
  it('is useful when comparing arguments', () => {
    const callback = jasmine.createSpy('callback');
    callback([1, 2, 3, 4]);
   expect(callback)
     .toHaveBeenCalledWith(jasmine.arrayContaining([4, 2, 3]));
   expect(callback)
     .not.toHaveBeenCalledWith(jasmine.arrayContaining([5, 2]));
  });
});

Usando regex para comparar comparar cadenas de texto

describe('jasmine.stringMatching', () => {
  it("matches as a regexp", () => {
    expect({foo: 'bar'})
      .toEqual({foo: jasmine.stringMatching(/^bar$/)});
    expect({foo: 'foobarbaz'})
      .toEqual({foo: jasmine.stringMatching('bar')});
  });
   describe("when used with a spy", () => {
    it("comparing arguments", () => {
      const callback = jasmine.createSpy('callback');
      callback('foobarbaz');
      expect(callback)
        .toHaveBeenCalledWith(jasmine.stringMatching('bar'));
      expect(callback)
        .not.toHaveBeenCalledWith(jasmine.stringMatching(/^bar$/));
    });
  });
});

Me pareció bastante confuso leer el diccionario cómo lo dejó Cristian, así que me tomé la tarea de hacerlo más digerible.

Creando un set de pruebas

describe("Componente", () => {
  it("debería ...", () => {
    expect(true).toBe(true);
  });
});

Agrupando por funcionalidad

describe("Componente", () => {
  describe("Funcionalidad uno", () => {
    it("debería ...", () => {
      expect(true).toBe(true);
    });
  });
});
<h3>Comparación</h3> <h4>Datos primitivos</h4>

Igualdad

expect(thing).toBe(realThing);

Desigualdad

expect(false).not.toBe(true);

El valor está definidido → No es undefined

expect(resul).toBeDefined();

El valor actual es falso. Ejemplo: result == 0, result == ‘’, result == false

expect(result).toBeFalsy(); 

El valor actual es verdadero. Ejemplo: result == ‘sd’, result == 1, result == true

expect(result).toBeTruthy();

result > 3

expect(result).toBeGreaterThan(3);

result >= 25

expect(result).toBeGreaterThanOrEqual(25);

result < 0

expect(result).toBeLessThan(0);

result <= 123

expect(result).toBeLessThanOrEqual(123);

thing== NaN

expect(thing).toBeNaN();

thing == -∞

expect(thing).toBeNegativeInfinity();

thing == +∞

expect(thing).toBePositiveInfinity();

result == null

expect(result).toBeNull();

El valor actual contiene una cadena.

'Hola mundo'.toContain('Hola') // true
['Hola', 'mundo'].toContain('Hola') // true
expect(array).toContain(anElement); expect(string).toContain(substring);
<h4>Objetos</h4>

Igualdad

expect(bigObject).toEqual({"foo": ['bar', 'baz']});

El espía fue llamado

expect(mySpy).toHaveBeenCalled();
expect(mySpy).not.toHaveBeenCalled();

El espía fue llamado antes que otro

expect(mySpy).toHaveBeenCalledBefore(otherSpy);

El espía fue llamado n veces:

expect(mySpy).toHaveBeenCalledTimes(3);

El espía fue llamado con los siguientes parámetros

expect(mySpy).toHaveBeenCalledWith('foo', 'bar', 2);

Verificar si un elemento tiene una clase

const el = document.createElement('div');
el.className = 'foo bar baz';
expect(el).toHaveClass('bar');

El valor actual comparado con una expresión regular

expect("my string").toMatch(/string$/); 
expect("other string").toMatch("her");

Ciclos de vida

describe("Component", () => {
  // Shared variables
  var foo = 0;
	beforeAll(() => {})
  beforeEach(() => {})
  afterEach(() => {})
  afterAll(() => {})
});

Deshabilitando pruebas

xdescribe("A spec", () => {
  it("waiting to be enable", function() {
    expect(true).toEqual(true);
  });
});
describe("A spec", () => {
  it("this run", () => {
    expect(true).toEqual(true);
  });
  xit("this is skipped", () => {
    expect(true).toEqual(true);
  });
});

Utilizando spyOn

describe('A spy', () => {
  let foo,
  bar = null;
	beforeEach(() => {
    foo = {
      setBar: value => {
        bar = value;
      },
    };
    spyOn(foo, 'setBar');
    foo.setBar(123);
    foo.setBar(456, 'another param');
  });
  it('tracks that the spy was called', () => {
    expect(foo.setBar).toHaveBeenCalled();
  });
  it('tracks that the spy was called x times', () => {
    expect(foo.setBar).toHaveBeenCalledTimes(2);
  });
  it('tracks all the arguments of its calls', () => {
    expect(foo.setBar).toHaveBeenCalledWith(123);
    expect(foo.setBar).toHaveBeenCalledWith(456, 'another param');
  });
});

Crear espía cuando desconocemos si la función existe

describe("Create a 'bare' spy", () => {
  let notSure;
  beforeEach(function() {
    notSure = jasmine.createSpy('notSure');
    notSure("I", "am", "a", "spy");
  });
  it("tracks that the spy was called", function() {
    expect(notSure).toHaveBeenCalled();
  });
});

Creando multiples espías en un mismo objeto

describe("Multiple spies", () => {
  const tape;
  beforeEach(() => {
    tape = jasmine.createSpyObj('tape', ['play', 'pause', 'stop']);
    tape.play();
    tape.pause();
    tape.rewind(0);
  });
  it("creates spies for each requested function", () => {
    expect(tape.play).toBeDefined();
    expect(tape.pause).toBeDefined();
    expect(tape.stop).toBeDefined();
  });
});

Verificar una propiedad de un objeto

describe("jasmine.objectContaining", () => {
  let foo;
  beforeEach(() => {
    foo = {
      a: 1,
      b: 2,
      bar: "baz"
    };
  });
  it("matches objects with the expect key/value pairs", () => {
    expect(foo).toEqual(jasmine.objectContaining({
      bar: "baz"
    }));
    expect(foo).not.toEqual(jasmine.objectContaining({
      c: 37
    }));
  });
});

Verificar una propiedad dentro de un objeto pasado como parámetro a una función

describe('jasmine.objectContaining', () => {
  it('is useful for comparing arguments', () => {
    const callback = jasmine.createSpy('callback');
    callback({
      bar: 'baz',
    });
    expect(callback).toHaveBeenCalledWith(
      jasmine.objectContaining({
        bar: 'baz',
      })
    );
  });
});

Verificar un valor dentro de un arreglo

describe("jasmine.arrayContaining", () => {
  let foo;
  beforeEach(function() {
    foo = [1, 2, 3, 4];
  });
  it("matches arrays with some of the values", () => {
    expect(foo).toEqual(jasmine.arrayContaining([3, 1]));
    expect(foo).not.toEqual(jasmine.arrayContaining([6]));
  });
});

Verificar un valor dentro de un arreglo pasado como parámetro a una función

describe('jasmine.arrayContaining', () => {
  it('is useful when comparing arguments', () => {
    const callback = jasmine.createSpy('callback');
    callback([1, 2, 3, 4]);
		expect(callback).toHaveBeenCalledWith(jasmine.arrayContaining([4, 2, 3]));
	  expect(callback).not.toHaveBeenCalledWith(jasmine.arrayContaining([5, 2]));
  });
});

Usando regex para comparar comparar cadenas de texto

describe('jasmine.stringMatching', () => {
  it("matches as a regexp", () => {
    expect({foo: 'bar'}).toEqual({foo: jasmine.stringMatching(/^bar$/)});
    expect({foo: 'foobarbaz'}).toEqual({foo: jasmine.stringMatching('bar')});
  });
   describe("when used with a spy", () => {
    it("comparing arguments", () => {
      const callback = jasmine.createSpy('callback');
      callback('foobarbaz');
      expect(callback).toHaveBeenCalledWith(jasmine.stringMatching('bar'));
      expect(callback).not.toHaveBeenCalledWith(jasmine.stringMatching(/^bar$/));
    });
  });
});

Un buen recurso como ayuda, pero se hace denso de entender que solo sea en texto y no con un video de apoyo.

Revisen este curso. Está lleno de errores y desorganizado.

Gracias, otros que implemente yo

const saludar = require("…/app");

var x = true;

const letra = “AB”;

var tmp = undefined;

describe(“Prueba de test para string”, () => {
it(“La función saluda”, () => {
expect(saludar(“Platzi”)).toBe(“Hola Platzi”);
});

it(“Comprobar valores booleanos”, () => {
expect(x).toBeTruthy();
});

it(“Comprobar valores iguales”, () => {
expect(x).toEqual(true);
});

it(“Comprobar valores iguales”, () => {
expect(x).toBe(true);
});

it(“Comprobar valores de expresiones regulares”, () => {
expect(x).toMatch("[^AB]");
});

it(“Comprobar valores undefined”, () => {
expect(tmp).toBeUndefined();
});
});

Los invito a consultar la documentación de Jasmine para chequear los matchers disponibles por versiones. Les dejo el enlace: Namespace: matchers.