Tengo un módulo AMD que quiero probar, pero quiero burlarme de sus dependencias en lugar de cargar las dependencias reales. Estoy usando requirejs, y el código para mi módulo se parece a esto:
define(['hurp', 'durp'], function(Hurp, Durp) {
return {
foo: function () {
console.log(Hurp.beans)
},
bar: function () {
console.log(Durp.beans)
}
}
}
¿Cómo puedo burlar a cabo hurp
y durp
por lo que puede efectivamente prueba de unidad?
javascript
unit-testing
mocking
requirejs
jergason
fuente
fuente
define
función. Sin embargo, hay algunas opciones diferentes. Publicaré una respuesta con la esperanza de que sea útil.Respuestas:
Entonces, después de leer esta publicación, se me ocurrió una solución que utiliza la función de configuración requirejs para crear un nuevo contexto para su prueba donde simplemente puede burlarse de sus dependencias:
Por lo tanto, crea un nuevo contexto donde las definiciones
Hurp
yDurp
serán establecidas por los objetos que pasó a la función. El Math.random para el nombre está quizás un poco sucio pero funciona. Porque si tiene un montón de pruebas, necesita crear un nuevo contexto para cada suite para evitar reutilizar sus simulacros, o cargar simulacros cuando desee el módulo requirejs real.En su caso, se vería así:
Así que estoy usando este enfoque en producción por un tiempo y es realmente robusto.
fuente
createContext
función. Entonces, en su caso, si solo pasa{hurp: 'hurp'}
a la función, eldurp
archivo se cargará como una dependencia normal.es posible que desee ver la nueva biblioteca Squire.js
de los documentos:
¡Squire.js es un inyector de dependencias para que los usuarios de Require.js faciliten burlarse de las dependencias!
fuente
He encontrado tres soluciones diferentes para este problema, ninguna de ellas agradable.
Definición de dependencias en línea
Fugly Tienes que abarrotar tus pruebas con muchas repeticiones de AMD.
Carga de dependencias simuladas de diferentes rutas
Esto implica el uso de un archivo config.js separado para definir rutas para cada una de las dependencias que apuntan a simulacros en lugar de las dependencias originales. Esto también es feo, ya que requiere la creación de toneladas de archivos de prueba y archivos de configuración.
Fingirlo en el nodo
Esta es mi solución actual, pero sigue siendo terrible.
Usted crea su propia
define
función para proporcionar sus propios simulacros al módulo y poner sus pruebas en la devolución de llamada. Luego,eval
el módulo para ejecutar sus pruebas, así:Esta es mi solución preferida. Parece un poco mágico, pero tiene algunos beneficios.
eval
con ira e imaginar a Crockford explotando de rabia.Todavía tiene algunos inconvenientes, obviamente.
define
en cada prueba, ya que allí es donde realmente se ejecutan sus pruebas.Estoy trabajando en un corredor de prueba para dar una sintaxis más agradable para este tipo de cosas, pero todavía no tengo una buena solución para el problema 1.
Conclusión
Burlarse de los departamentos en requirejs es una mierda. Encontré una forma en que funciona, pero todavía no estoy muy contento con eso. Por favor, avíseme si tiene alguna idea mejor.
fuente
Hay una
config.map
opción http://requirejs.org/docs/api.html#config-map .Sobre cómo usarlo:
Configure RequireJS explícitamente;
En este caso, para el código normal y de prueba, puede usar el
foo
módulo, que será una referencia real del módulo y el código auxiliar correspondiente.fuente
Puede usar testr.js para burlarse de las dependencias. Puede configurar testr para cargar las dependencias simuladas en lugar de las originales. Aquí hay un ejemplo de uso:
Mira esto también: http://cyberasylum.janithw.com/mocking-requirejs-dependencies-for-unit-testing/
fuente
Esta respuesta se basa en la respuesta de Andreas Köberle .
No fue tan fácil para mí implementar y comprender su solución, por lo que lo explicaré con un poco más de detalle cómo funciona, y algunas dificultades para evitar, con la esperanza de que ayude a futuros visitantes.
Entonces, primero que nada la configuración:
estoy usando Karma como corredor de prueba y MochaJs como marco de prueba.
Usar algo como Squire no funcionó para mí, por alguna razón, cuando lo usé, el marco de prueba arrojó errores:
RequireJs tiene la posibilidad de asignar identificadores de módulo a otros identificadores de módulo. También permite crear una
require
función que utiliza una configuración diferente a la globalrequire
.Estas características son cruciales para que esta solución funcione.
Aquí está mi versión del código simulado, que incluye (muchos) comentarios (espero que sea comprensible). Lo envolví dentro de un módulo, para que las pruebas puedan requerirlo fácilmente.
El mayor obstáculo que encontré, que literalmente me costó horas, fue crear la configuración RequireJs. Traté de copiarlo (en profundidad) y solo anular las propiedades necesarias (como contexto o mapa). ¡Esto no funciona! Solo copie el
baseUrl
, esto funciona bien.Uso
Para usarlo, solicítelo en su prueba, cree los simulacros y luego páselo
createMockRequire
. Por ejemplo:Y aquí un ejemplo de un archivo de prueba completo :
fuente
si desea hacer algunas pruebas js simples que aíslan una unidad, simplemente puede usar este fragmento:
fuente