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.
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? –
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. –