Introducción al Unit Testing

Jesús Rodríguez

Foxandxss

¿Qué es el testing y en concreto el Unit Testing?

¿Hará que escriba mejor código?

NO

¿No es una pérdida de tiempo?

Código extra

function generar(p1, p2, options) {
  // no hago nada con options
}

¿Solución? TDD

APIs mal hechas

Angular 1.x:

// Ejecutar detección de cambios
$apply();

Angular 2+:

// Ejecutar detección de cambios
fixture.detectChanges();

MAL

proceso.generar(datos: any);

BIEN

registro,validar(formulario: Usuario);

Refactorización

export class SomeService {  
  people: Person[] = [];
  someRegex: string = /^....$/;
  someId = 1;
  ...
  ...
}
export class SomeComponent {
  users: User[];
  
  constructor(private http: Http) {
    this.http.get('api/users').subscribe(....);
  }
}

¿Funcionará?

+

¿Funcionará... con todos los navegadores?

DEMO

¿Conclusiones?

No hay código extra

La API es buena

¿Funcionará? Seguro.

¿Refactor? Adelante, los tests te ayudarán.

Angular v4 Testing

Un pequeño repaso...

En Angular tenemos los NgModule:

@NgModule({
  imports: [ BrowserModule, HttpModule ],
  declarations: [ AppComponent, TeamsComponent, CapitalizePipe ],
  providers: [ TeamService ],
  bootstrap: [ AppComponent ]
})
export AppModule {}

Que es como una caja donde registramos las distintas piezas de nuestra aplicación...

UNIT testing y mocks

La regla de oro de los unit test, es que una unidad (unit) tiene que ser testeada sin necesitar ninguna de sus dependencias.

class TeamServiceSpy {
  getTeams = jasmine.createSpy('getTeams').and.callFake(() => {
    return Observable.of([{ id: 0, name: 'Madrid'}, { id: 1, name: 'Malaga' }]);
  });
}

Un ejemplo de mock de un servicio sería:

Eso quiere decir, que si una unidad tiene dependencias, tenemos que reemplazarlas por mocks.

TestBed

En testing, tenemos nuestros propios NgModule:

TestBed.configureTestingModule({
  imports: [ ... ],
  declarations: [ ... ],
  providers: [ ... ],
  ...
});

Nuestra propia caja vacía que podemos configurar como necesitemos.

TestBed es la utilidad principal de Angular para escribir nuestros tests.

DEMO

¿Conclusiones?

Datepicker testeado sin esfuerzo

Ya no hay que mirar más 20 mil fechas

Es fácil de hacer TDD a una app a ciegas

No hemos tenido ni que lanzar el servidor

Referencias

Introducción original:

Documentación Jasmine:

Angular v4 testing:

Mil gracias

Introducción al testing

By Jesus Rodriguez

Introducción al testing

Introducción al Unit Testing y su aplicación en Angular v4

  • 497