2012-01-20 8 views
8

Tengo un igualador de costumbre en algunas especificaciones de prueba jazmín de la forma:¿Hay alguna forma de utilizar los mezcladores predeterminados de Jasmine en los mezcladores personalizados?

this.addMatchers({ 
    checkContains: function(elem){ 
     var found = false; 
     $.each(this.actual, function(actualItem){ 

      // Check if these objects contain the same properties. 
      found = found || actualItem.thing == elem; 
     }); 
     return found; 
    } 
}); 

Por supuesto, en realidad no actualItem.thing == elem comparar al contenido- tengo que utilizar una de las soluciones más complejas en Object comparison in JavaScript.

No puedo dejar de notar, sin embargo, que Jasmine ya tiene un buen inspector de igualdad de objetos: expect(x).toEqual(y). ¿Hay alguna forma de usar eso dentro de un marcador personalizado? ¿Hay alguna forma general de usar los mezcladores dentro de los mezcladores personalizados?

Respuesta

5

Sí, es ligeramente hacky pero totalmente posible.

Lo primero que tenemos que hacer es hacer que la clase Jasmine.Env esté disponible. Personalmente, he hecho esto en mi SpecRunner.html ya que ya está configurado allí de todos modos. De la carga de mi SpecRunner tengo la siguiente secuencia de comandos que se ejecuta:

(function() { 
     var jasmineEnv = jasmine.getEnv(); 
     jasmineEnv.updateInterval = 1000; 

     var trivialReporter = new jasmine.TrivialReporter(); 

     jasmineEnv.addReporter(trivialReporter); 

     jasmineEnv.specFilter = function(spec) { 
     return trivialReporter.specFilter(spec); 
     }; 

     var currentWindowOnload = window.onload; 

     window.onload = function() { 
     if (currentWindowOnload) { 
      currentWindowOnload(); 
     } 
     execJasmine(); 
     }; 

     function execJasmine() { 
     jasmineEnv.execute(); 
     }; 

    })(); 

Así que después de la execJasmine declaración función pulso el jasmineEnv en el espacio de nombres global mediante la adición de esto:

this.jasmineEnv = jasmineEnv; 

Ahora, en cualquiera de mis archivos de especificaciones puedo acceder a la variable jasmineEnv y eso es lo que contiene el código central de los emparejamientos.

Al mirar aEqual específicamente, toEqual llama a la función jasmine.Env.prototype.equals_. Esto significa que en su customMatcher puede hacer lo siguiente:

beforeEach(function(){ 
    this.addMatchers({ 
     isJasmineAwesome : function(expected){ 
      return jasmineEnv.equals_(this.actual, expected); 
     } 
    }); 
}); 

Desafortunadamente, el uso de este método sólo le dará acceso a los métodos siguientes:

  1. compareObjects_
  2. equals_
  3. contains_

El resto de los matchers residen en la clase jazmín.Matchers pero no he b een capaz de hacer que ese público aún. Espero que esto te ayude de alguna manera u otra

+0

¡Impresionante, gracias! Este puede ser un caso en el que la solución que estaba buscando (la que dio) es peor que el problema que estaba tratando de evitar (mi propio comprobador de igualdad de objetos). Sin embargo, es genial, sin embargo. – Fishtoaster

+0

Si desea utilizar un marcador personalizado A dentro de otro marcador personalizado B, puede agregar la lógica de su marcador A al jasmin.Env.prototype y luego invocar ese registro desde su marcador B utilizando jasmine.getEnv () .myMatcherFn(). –

Cuestiones relacionadas