2009-12-10 24 views
7

¿Es posible probar myInnerFunction a continuación?Prueba de funciones de JavaScript dentro de funciones anónimas

var val = function() { 
    var myInnerfunction = function(input) { 
     return input + ' I ADDED THIS'; 
    }; 
    return myInnerfunction('test value'); 
}(); 

Debido myInnerFunction es esencialmente un miembro privado de la función externa anónima ejecutada, no parece como que es comprobable desde el exterior.

+1

Las respuestas están planteando una pregunta más amplia ahora. Este fue un ejemplo trivial. Tengo funciones JS que están lo suficientemente unidas a una estructura DOM esperada que están acopladas a ella, y no pueden ser arrastradas a una API genérica de servicios públicos. Necesito probar estas funciones; su lógica es significativa, pero todas están declaradas en-DOM-ready dentro de una función literal, y se adjuntan como manejadores de eventos a los elementos DOM. Son esencialmente privados, y están estrechamente relacionados con la estructura DOM, pero aún necesito probarlos. ¿Dónde deberían residir para poder tener acceso a ellos desde mis pruebas? –

+0

Para tomar los métodos que deseo probar de la función anónima que ejecuta la biblioteca en dom-ready, los coloqué dentro de un "paquete" que corresponde a la funcionalidad que está pasando en mi página. Aunque este código realmente solo se usará en esta página en particular, y solo a través de los controladores de eventos que he agregado a este DOM específico, al menos puedo probar esta lógica ahora. Gracias a todos por dirigirme. Cualquier otro pensamiento es bienvenido. –

Respuesta

1

Creo que mi respuesta es (como tantas otras) que lo estoy haciendo mal. Lo que he definido como una función 'privada' es realmente algo que necesita ser probado. Era solo privado porque no quería exponerlo dentro de una API de utilidades o algo así. Pero aún podría estar expuesto a través del espacio de nombres de mi aplicación.

De modo que dentro de la función anónima que se ejecuta en dom-ready, solo adjunto mis funciones predefinidas como manejadores de eventos a los ganchos DOM correctos. Las funciones mismas, aunque no se almacenan con mis funciones de utilidad más abiertas, todavía se almacenan públicamente dentro de un paquete en mi espacio de nombres asociado con la estructura DOM con la que están tratando. De esta forma puedo llegar a ellos y probarlos apropiadamente.

1

afaik unit testing no se refiere al funcionamiento interno de las cosas que prueba. El punto es que pruebe la funcionalidad, es decir: hace lo que se supone que debe hacer, no como lo hace. lo tanto, si se utiliza un miembro privado interno, se debe no ser comprobable ...

1

Puede probar el comportamiento externo que es observable. En este caso simple, devolvió el valor de la función interna, pero en un ejemplo del mundo real, puede combinar el resultado de esa función interna con otra cosa. Esa combinación es lo que probarías, no las salidas directas del método privado.

Intentar probar el método privado hará que su código sea difícil de cambiar y refactorizar, incluso cuando se preserve el comportamiento externo. Dicho esto, me gusta ver las pruebas unitarias no como pruebas exhaustivas de su código, sino simplemente proporcionando un ejemplo de la API y cómo se comporta en diferentes condiciones. ;)

5

que podría exponer intencionalmente un gancho de prueba con el mundo exterior, al igual que posiblemente esto:

var val = function() { 
    var myInnerfunction = function(input) { 
     return input + ' I ADDED THIS'; 
    }; 
    /* START test hook */ 
    arguments.callee.__test_inner = myInnerFunction; 
    /* END test hook */ 
    return myInnerfunction('test value'); 
}(); 

ahora, una vez val se ha ejecutado al menos una vez, puede hacer referencia val.__test_inner y llamarlo con entradas comprobables .

Los beneficios de este enfoque: 1. que eligen lo que se expone y no (también un negativo porque usted tiene que acordarse de hacerlo) 2. todo lo que obtiene es una copia referencia al método privado, por lo que no puede cambiarlo accidentalmente, solo utilícelo y vea lo que produce

1. Si el miembro privado cambia (o depende) del estado de su función principal/principal, es más difícil prueba de unidad alrededor de eso, ya que tiene que volver a crear o controlar artificialmente el estado principal/host al mismo tiempo 2. Como se mencionó, estos ganchos deben agregarse manualmente

Si es realmente inteligente, puede hacer que su proceso de compilación busque bloques de comentarios como el anterior y elimine los ganchos de prueba al crear su compilación de producción.

+0

Me gusta su enfoque, aunque quiero intentar mantener el código de producción lo más limpio posible. Lo que realmente estoy haciendo es proporcionar una función al controlador de eventos listo para Dom de una biblioteca, por lo que no sé si podría hacer esto y aún así tener acceso a él desde la biblioteca. –

+0

es exactamente por eso que sugerí que el proceso de creación elimine bloques de comentarios formateados como el anterior. –

Cuestiones relacionadas