2012-08-13 9 views
33

? Hay muchos documentos que muestran cómo agregar un matcher a una especificación de Jasmine (here, por ejemplo).¿Hay alguna manera de agregar un matcher de Jasmine a todo el entorno

¿Alguien ha encontrado una manera de agregar matchers a todo el entorno; Estoy queriendo crear un conjunto de combinaciones útiles a las que puedan llamar todas y cada una de las pruebas, sin copypasta en todas mis especificaciones.

Actualmente estamos trabajando para realizar ingeniería inversa en la fuente, pero preferiríamos un método probado y verdadero, si existe.

Respuesta

47

Claro, usted simplemente llama al beforeEach() sin ningún tipo de alcance de especificaciones, y agrega emparejamientos allí.

Esto agregaría globalmente un marcador toBeOfType.

beforeEach(function() { 
    var matchers = { 
    toBeOfType: function(typeString) { 
     return typeof this.actual == typeString; 
    } 
    }; 

    this.addMatchers(matchers); 
}); 

describe('Thing', function() { 
    // matchers available here. 
}); 

He hecho un archivo llamado spec_helper.js lleno de cosas como comparadores personalizados que sólo tiene que cargar en la página antes de correr el resto de la suite de especificaciones.

+1

También encontré un buen ejemplo aquí: http://tobyho.com/2012/01/30/write-a-jasmine-matcher/ – Dancrumb

+0

Probé enlace compartido por Dancrumb, idealmente su enfoque limpio y ordenado sin embargo, no funcionó, así que adopté el enfoque de Alex. – joy

+2

Aquí está uno para el jazmín 2.0+ '' '' Javascript beforeeach (function() { jasmine.addMatchers ({ toEqualData: function() {{ retorno comparar: la función (real, esperado) {{retorno pase: angular.equals (real, esperado)} } } } }); }); '' '' – mikker

12

Aquí está uno para el jazmín 2.0+:

beforeEach(function(){ 
    jasmine.addMatchers({ 
    toEqualData: function() { 
     return { 
     compare: function(actual, expected) { 
      return { pass: angular.equals(actual, expected) }; 
     } 
     }; 
    } 
    }); 
}); 

Tenga en cuenta que este utiliza angular de angular.equals.

+0

Esto no funciona para mí ... escribir argumentos de comparación siempre es un objeto vacío. –

+1

¡Esa es la respuesta que he estado buscando! –

0

Editar: No sabía que era una implementación interna que puede estar sujeta a cambios. Úselo bajo su propio riesgo.

jasmine.Expectation.addCoreMatchers(matchers) 
0

Con base en las respuestas anteriores, he creado la siguiente configuración para angular-cli. También necesito un módulo externo en mi matcher (en este caso moment.js)

Nota En este ejemplo he añadido un equalityTester, pero debería funcionar con un cliente matcher

Crear un archivo con el src/spec_helper.ts siguiente contenido:

// Import module 
import { Moment } from 'moment'; 

export function initSpecHelper() { 

    beforeEach(() => { 
    // Add your matcher 
    jasmine.addCustomEqualityTester((a: Moment, b: Moment) => { 
     if (typeof a.isSame === 'function') { 
     return a.isSame(b); 
     } 
    }); 
    }); 

} 

Luego, en src/test.ts importar la función initSpecHelper() añadir ejecutarlo. Lo coloqué antes del test TestBed de Angular, que parece funcionar bien.

import { initSpecHelper } from './spec_helper'; 

//... 

// Prevent Karma from running prematurely. 
__karma__.loaded = function() {}; 

// Init our own spec helper 
initSpecHelper(); 

// First, initialize the Angular testing environment. 
getTestBed().initTestEnvironment(
    BrowserDynamicTestingModule, 
    platformBrowserDynamicTesting() 
); 

//... 
Cuestiones relacionadas