2011-12-20 12 views
7

Tengo un complemento de autocompletar de JavaScript que utiliza las siguientes clases (escritas en coffeescript): Consulta, Sugerencia, SugerenciaColección y Autocompletar. Cada una de estas clases tiene una especificación asociada escrita en Jasmine.Cómo exponer los objetos javascript para pruebas de unidades sin contaminar el espacio de nombres global

El plugin se define dentro de un módulo, por ejemplo:

(function(){ 
    // plugin... 
}).call(this); 

Esto evita que las clases de contaminar el espacio de nombres global, sino que también les esconde de las pruebas (especificaciones con jazmín, o unidad de pruebas con algo así como q-unidad).

¿Cuál es la mejor manera de exponer las clases de JavaScript u objetos para probar sin contaminar el espacio de nombres global?

Voy a responder con la solución que se me ocurrió, pero espero que haya algo más estándar.

Actualización: Mi intento de solución

Porque soy un newb con < 100 XP, no puede responder a mi propia pregunta durante 8 horas. En lugar de esperar, solo agregaré lo que hice aquí.

Para especificar estas clases, inventé un objeto global llamado _test que expuse todas las clases dentro para probar. Por ejemplo, en CoffeeScript:

class Query 
    // ... 

class Suggestion 
    // ... 

// Use the classes 

// Expose the classes for testing 
window._test = { 
    Query: Query 
    Suggestion: Suggestion 
} 

Dentro de las especificaciones de mi, entonces, puedo revelar la clase Estoy prueba:

Query = window._test.Query 

describe 'Query', -> 
    // ... 

Esto tiene la ventaja de que sólo el objeto _test está contaminado, y se es poco probable que colisione con otra definición de este objeto. Sin embargo, todavía no está tan limpio como me gustaría. Espero que alguien proporcione una mejor solución.

+0

exponga Tal vez alguna variable interna, solamente? Ejemplo: 'window.exposedVars = this' (inner of closure)? –

+0

Acabo de agregar mi solución propuesta unos segundos después de publicar esto. ¿Es lo que estabas sugiriendo? – Mitch

+0

¿Cómo es útil su complemento y aún no agrega nada al espacio de nombre global? Tengo curiosidad genuina, quizás estás haciendo algo de lo que no estoy enterado. Por lo que puedo decir, siempre tiene que haber al menos un objeto que salga al espacio de nombres global. –

Respuesta

3

Creo que algo así como el sistema de módulo CommonJS (como el utilizado por brunch, por ejemplo) funcionaría.

Puede separar su código en módulos, y las partes que lo necesitan los importarían a través de require. La única parte que se "contamina" es el mapa del módulo mantenido por el código de administración del módulo, muy similar al objeto test.

En Autocomplete.coffee

class exports.Query 
// ... 

class exports.Suggestion 
// ... 

y luego en Autocomplete.spec.coffee

{Query, Suggestion} = require 'app/models/Autocomplete' 

describe 'Query', -> 
+0

Interesante. No había visto este sistema antes. Supongo que es bastante similar en esencia a lo que hice. Sin embargo, para un plugin liviano que quieras compartir con otros, no estoy seguro de querer agregar todo un sistema de administración de módulos. Aún así, la página de brunch es una lectura buena y relevante. – Mitch

Cuestiones relacionadas