Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Realización de tests unitarios

Realización de tests unitarios

Diapositivas utilizadas en la presentación "Realización de tests unitarios" del grupo meetup de AngularJS Madrid

fzberlinches

January 20, 2014
Tweet

More Decks by fzberlinches

Other Decks in Technology

Transcript

  1. Sobre mí Coorganizador del grupo meetup . Organizador del grupo

    meetup . Organizador del grupo meetup . Aerotranstornado: piloto online P1 y controlador S1 en la red . Desarrollador Senior Front End y Consultor de Accesibilidad Web. Accesibilidad Spain WordPress Madrid Madrid Sass & Compass VATSIM
  2. Antes de comenzar... En Adesis buscamos gente con ganas de

    trabajar con AngularJS. Aquellos que estéis interesados enviad vuestro cv a [email protected]
  3. ¿Por qué los tests? Because you're not Chuck Norris. Chuck

    Norris' code tests itself, and it always passes, with 0ms execution time.
  4. ¿Qué querríamos testar en nuestra aplicación? Que nuestra directiva genera

    la plantilla correctamente. Que nuestro controlador realiza las acciones deseadas. Las funcionalidades de nuestro . Que el filtro que hemos hecho es correcto. Etc. servicio
  5. ¿Qué problemas he tenido (y sigo teniendo) en ocasiones? Hacer

    un test de algo que no es necesario. Como por ejemplo, intentar probar alguna capacidad de AngularJS. Problemas con las dependencias. ¿Añado todas? ¿Sólo las que necesito? Problemas con las plantillas de las directivas (casi todos los ejemplos que hay usan template en vez de templateUrl). No sabemos cómo trucar ciertos servicios. Problemas con las promesas.
  6. ¿Qué necesitamos? Un framework para la realización de tests unitarios

    en JavaScript. Karma, creado por el equipo de Angular JS.
  7. Un "truquito" antes de seguir Cómo podemos saltar tests o

    ejecutar algunos en concreto usando Jasmine (que trae Karma): un único test: cambiar it por iit. saltar un test: cambiar it por xit. un único bloque de tests: cambiar describe por ddescribe. saltarnos un bloque de tests: cambiar describe por xdescribe.
  8. Esqueleto básico (function() { 'use strict'; describe('myDir awesome test', function

    () { var element, scope; // inyecciones de modulos beforeEach(module('myDirModule')); // configuraciones beforeEach(inject(function ($injector) { // preparamos variables comunes para usar en el test })); it('has some properties', function() { }); it('does something to the scope', function() { }); }); }());
  9. Esqueleto para una directiva describe('myDir awesome test', function () {

    var element, scope; // inyecciones de modulos beforeEach(module('myDirModule')); beforeEach(inject(function ($injector) { scope = $injector.get('$rootScope'); element = $compile('<my‐dir></my‐dir>')(scope); })); it('has some properties', function() { }); it('does something to the scope', function() { }); });
  10. Funciones propias function myConfigSrvMock() { // devuelvo los datos que

    necesite el servicio que voy a testear } beforeEach(function() { var myAppConfig; module(function ($provide) { myAppConfig = myConfigSrvMock(); $provide.value('myAppConfig', myAppConfig); }); inject(function ($injector, $compile) { }); }); Puedes incluir todas las llamadas que quieras a module() e inject() pero tan pronto como se ha usado un inject() no se puede hacer uso de module() de nuevo.
  11. Mocking HTTP Requests con $httpBackend it('should get login success', inject(function(LoginService,

    $httpBackend) { $httpBackend.expect('POST', 'https://api.mydomain.com/login').respond(200, "[{ success : 'true', id : 123 }]"); LoginService.login('[email protected]', 'password').then(function(data) { expect(data.success).toBeTruthy(); }); $httpBackend.flush(); });
  12. Enlaces de interés How to Unit Test Controllers In AngularJS

    Without Setting Your Hair On Fire Advanced Testing and Debugging in AngularJS How can I simulate a click event in my AngularJS directive test? Chai Assertion Library