Seleccionar página

Afortunadamente disponemos de excelentes librerías y paquetes para hacer pruebas en Javascript. Mocha, Jazmine, Jest, Chai, ShouldJS y otras soluciones similares nos ofrecen una funcionalidad completa y robusta para hacer nuestros juegos de pruebas. Animamos a todos los que tengan curiosidad sobre cómo establecer un sistema de pruebas bien estructurada que revisen estas opciones.

No obstante, sin que nos demos cuenta, disponemos en todos los navegadores modernos y en Node de un sistema para hacer pruebas sin necesidad de instalar absolutamente nada. Si no nos importa utilizar un sistema minimalista, sin dependencias y que funciona muy bien, podemos utilizar una poco conocida funcionalidad de console, que parece ser la navaja multiuso del programador: console.assert().

Este método es un assert similar al que ofrecen librerías o paquetes mucho más completos, pero la gran ventaja es que lo tenemos disponible directamente en nuestro navegador o en Node, sin necesidad de cargar nada más. Lo que console.assert() hace es evaluar una expresión y si es verdadera la ejecución continuará sin problemas, pero si es falsa, lanzará una excepción.

Sintáxis de console.assert()

Esta instrucción tiene estas opciones:

console.assert(expresión a evaluar, [mensaje], […])

  • expresión a evaluar: es cualquier expresión válida en Javascript. Puede ser la llamada a una función, el valor de una variable, la comparación de dos valores, etc. Si esta evaluación devuelve false o un valor equivalente como 0 o "", se lanzará un error.
  • mensaje y parámetros siguientes: opcionalmente, cuando se lanza el error se mostrará el mensaje que se pasa a continuación, pudiendo incluirse varios mensajes que se encadenarán o sentencias de escape y sus valores (de forma similar a como funciona console.log().

Podemos ver a continuanción un par de sencillos ejemplos:

console.assert(true, 'No hace nada');
console.assert(false, 'Ups %s.', 'algo no ha funcionado');

Algunas consideraciones

Hay que tener en cuenta que siempre tenemos que incluir una expresión que se evalue como verdadera. Si es necesario deberemos poner un not (!) cuando el valor que obtenemos es false.

Este sistema es limitado, por ejemplo, no se muestra mensajes explicando las pruebas que se van pasando, pero es sencillo incluirlos con console.log.

No creemos que este sea el mejor sistema para hacer pruebas, simplementenes el medio más sencillo y fácil de utilizar, por lo que nadie tiene excusas para no hacer un juego de pruebas de sus funciones o módulos.

Ejemplo del uso de console.assert()

En nuestra serie de artículos sobre la creación de un módulo universal de comparación de cualquier tipo de dato en Javascript (que hemos denominado esequal.js) vamos a utilizar console.assert() como sistema básico para hacer las pruebas.

Por ejemplo, en cuanto hemos desarrollado un módulo para que funcione en los navegadores y Node hemos creado también una prueba muy sencilla para comprobar que está funcionando correctamente:

if (typeof require !== 'undefined' && typeof equal === 'undefined') {
    var equal = require( './esequal' );
}

console.log('Must be a function');
console.assert( typeof equal === 'function' );
console.assert( equal.length === 2 );
console.assert( equal.name === 'equal' );
console.log('--- Ok');

if (typeof process !== 'undefined' && typeof process.exit !== 'undefined') {
    process.exit( 0 );
}

Primera versión de las pruebas de esqueal.js en GitHub.

Como se puede observar hemos incluido algunas instrucciones dependiendo si está disponible alguna funcionalidad propia de Node como require() para cargar el módulo o process.exit() para terminar la ejecución. De esta forma el juego de prueba se puede ejecutar tanto en el servidor como en el cliente.

Conclusión

Que nadie se equivoque, no estamos defendiendo que se abandonen las librerías y frameworks de pruebas, simplemente exponemos una muy sencilla forma de hacer pruebas que tenemos a nuestra disposición y que funciona. Es limitada, pero no requiere de ningún elemento externo, ya que viene por defecto en la mayoría de los navegadores y en Node. Por ello nos hemos animado a explicar cómo usarla y que quien quiera pueda sacarle todo el partido.

Como hemos comentado, en los próximos artículos donde se avanzará en el desarrollo de un módulo que permita comparar cualquier valor de Javascript vamos a utilizar este mecanismo para hacer las pruebas. Como se podrá ver, nuestra versión final de las pruebas incluye más de ochocientas pruebas con este sistema.

Novedades

Limitar el tamaño de un Map

Limitar el tamaño de un objeto Map no parece una idea muy razonable, pero cuando tu programa se ejecuta sin interrupción durante días, semanas, meses e inclusos años, es muy importante controlar el tamaño de la memoria utilizada para evitar problemas inesperados. Una simple función memoize puede llegar a almacenar mucha más información de la que puedes pensar. Aquí te contamos como limitar el tamaño de un objeto Map para estas situaciones.

Cómo conseguir un objeto Map ordenado

Mantener un objeto Map con su contenido ordenado no es algo tan sencillo como parece. Por defecto, Map guarda los datos en el mismo orden en el que han sido creados en el objeto. Para conseguir que el contenido se muestre ordenado tendremos que explorar varias interesantes alternativas que nos descubrirán algunas de características interesantes de estas estructuras de datos.

¿Es una función nativa de Javascript?

Comprobar si una determinada función es una función nativa de Javascript o es una función escrita en código es algo más complicado de lo que pueda parecer a primera vista. No hay grandes diferencias entre una función nativa y una escrita por nosotros, por lo que tenemos que buscar mecanismos algo indirectos para poder diferenciarlas.

breves

Descrubir algunas características de console

En el día a día nos encontramos muy a menudo utilizando console. Es una navaja multiusos que nos facilita la vida a la hora de depurar nuestro código. La mayoría de nosotros ha utilizado console.log(), pero tiene otras muchas funcionalidades.

Matrices dispersas o sparse arrays en JS

Una característica que puede producir algunos problemas, si no lo tenemos en cuenta, es la posibilidad de tener matrices con huecos, es decir, con algunos de sus elementos sin definir. Es lo que se suele denominar una matriz dispersa o sparse array. Veamos cómo trabajar con esta características de las matrices.

Operadores de bits usados con asiduidad

Cada día más a menudo podemos encontrar operadores binarios utilizados como formas abreviadas de algunas operaciones que de otra forma sería algo menos compactas y, quizás, más comprensibles. Veamos algunos casos en detalle.

Obtener todas las propiedades de un objeto

¿Cómo podemos obtener absolutamente todas las propiedades de un objeto? No disponemos de un método nativo para este propósito, pero en unas pocas lineas podemos construir una función para nuestro propósito.