2011-06-24 22 views
6

En Javascript, contaminar el espacio de nombres global generalmente se considera como algo malo. Es por eso que Coffeescript envuelve todo su Javascript en un contenedor (function() {}).call(this);.QUnit + coffeescript scope

Sin embargo, he comenzado a escribir pruebas de QUnit para mi código de Coffeescript, y QUnit se queja de que no puede encontrar mis funciones.

1. Died on test #1: getGoodNamePart is not defined 
getGoodNamePart is not defined at Object.<anonymous> (file:///Users/kevin/Documents/docs/code/chrome/tests.js:2:10) at Object.run 

Me gustaría probar las variables sin contaminar el espacio de nombres global. ¿Cuál es una buena manera de hacer esto?

aquí está el Javascript generada Quiero poner a prueba:

(function() { 
getGoodNamePart = function(str) { 
    if (str.charAt(0) === '"') { 
     str.replace(/" <[^>]+>$"/g, ""); 
     str.replace(/"/g, ""); 
     return str; 
    } else if (str.charAt(0) === '<') { 
     str.replace(/<|>/g, ""); 
     return str; 
    } else { 
     return str; 
    } 
    }; 
}).call(this); 

y mi archivo Test.js es:

test('getGoodNamePart()', function() { 
    equals(getGoodNamePart("\"Kev Burke\" <[email protected]>"), "Kev Burke", "\"name\" <email> works"); 
    equals(getGoodNamePart("", "", "empty string works")); 
    equals(getGoodNamePart("[email protected]", "[email protected]", "raw email works")); 
    return equals(getGoodNamePart("<[email protected]>", "[email protected]", "email inside carets -> carets get stripped")); 
}); 

Gracias, Kevin

+0

un código de ejemplo sería útil. –

+0

Hola Aaron, he añadido un ejemplo. –

Respuesta

6

Así, se dice que desea pruebe getGoodNamePart sin contaminar el espacio de nombres global. Pero, CoffeeScript automáticamente modulariza cada archivo (con buena razón, vea my answer here), lo que significa que la única manera de acceder a las funciones en todos los archivos es adjuntarlas a algún objeto global. (Estoy asumiendo que estamos hablando aquí el navegador, no un entorno CommonJS, como Node.js, donde debería usar exports.)

Eso le da tres opciones:

  1. Adjunte getGoodNamePart al window. Esto es más fácil, ya que el único cambio necesario es el prefijo getGoodNamePart con window. (o solo @), pero, por supuesto, esto maximiza la contaminación del espacio de nombres.
  2. Adjunte getGoodNamePart a otra cosa que ya está asociada a window o global.
  3. Mueva sus pruebas dentro del mismo archivo como getGoodNamePart (una práctica inusual en el mundo JS, pero que vale la pena considerar, ya que mantiene el espacio de nombres global intacto y le permite ir fácilmente entre su código y sus pruebas).

Digamos que usted quiere ir con # 2, exportar funciones como getGoodNamePart puramente para la prueba. Llámalos "objetivos de prueba". En la parte superior de cada archivo con un blanco de prueba, añadir

window.testTargets ?= {} 

y cuando se define getGoodNamePart, escribir

testTargets.getGoodNamePart = getGoodNamePart = (str) -> 
    ... 

A continuación, en la parte superior del conjunto de pruebas QUnit, escribir

{getGoodNamePart} = testTargets 

para obtener la función.

+0

¡Gran respuesta, gracias Trevor! –

2

puedo compilar el archivo de café con la bandera --bare, para el propósito de prueba

$ coffee -c -b your_file

esto no modularizar el código compilado