Joel Andrews es un desarrollador políglota que vive en la lluviosa costa oeste de Canadá. Desempeña diversas funciones en Kashoo, como desarrollador backend, administrador de bases de datos, DevOps, propietario de producto y, ocasionalmente, desarrollador frontend web y Android. Siente un amor profundo y duradero por Couchbase (especialmente Couchbase Móvil), lo que le hace totalmente imparcial a la hora de debatir los pros y los contras de cualquier solución de almacenamiento de datos.
En mi anterior entrada del blogpresenté synctosuna práctica herramienta de código abierto que hemos creado y utilizamos en Kashoo para facilitar el proceso de creación de funciones de sincronización completas para Couchbase Pasarela de sincronización. Casi al final de ese post aludí al hecho de que synctos incluye un módulo integrado de ayuda para pruebas que te ayuda a escribir pruebas que validan tus definiciones de documentos. Siempre es una buena idea probar tu código/configuración en busca de errores, y tus definiciones de documentos de synctos no son diferentes.
En este post te guiaré a través de lo que se necesita para empezar a escribir tus propias especificaciones/casos de prueba. Antes de continuar, le sugiero que lea el puesto introductoriosi aún no lo has hecho, para asegurarte de que tienes una comprensión general de lo que es synctos y cómo funciona.
En primer lugar, tendrá que instalar Node.js para utilizar synctos. Una vez instalado, debe crear un directorio de proyecto vacío con un nuevo archivo llamado "package.json":
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
{ "nombre": "synctos-test-examples", "devDependencias": { "expect.js": "^0.3.1", "moca": "^3.2.0", "simple-mock": "^0.7.3", "synctos": "1.x" }, "scripts": { "test": "./generate-sync-function.sh && node_modules/.bin/mocha" } } |
Este archivo indica al gestor de paquetes de Node.js (npm) qué dependencias necesitarán synctos y sus casos de prueba: esperar.js para las afirmaciones de prueba, moca para ejecutar sus pruebas, y simple-mock para imitar o copiar funciones de la pasarela de sincronización API de la función de sincronización. También especifica el comando "test" que ejecutará sus pruebas con mocha.
A continuación, ejecute el siguiente comando desde la raíz del directorio de su proyecto para descargar los paquetes que necesita a su directorio local "node_modules":
|
1 |
npm instale |
El proyecto necesitará algunas definiciones de documentos, así que crea "my-example-doc-definitions.js" en el directorio raíz del proyecto:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
{ ejemploDoc: { typeFilter: simpleTypeFilter, canales: función(doc, oldDoc) { devolver { escriba a: [ "escribir + doc._id ] } }, verificadores de propiedades: { foo: { tipo: cadena, obligatorio: verdadero, regexPattern: /^[a-z]{3}$/ } } } } |
Como puede ver, se trata de una definición de documento muy sencilla con fines de demostración. Sus propias definiciones de documento serán sin duda más amplias y complejas, pero se aplican los mismos principios. El archivo define una única propiedad del documento (una cadena obligatoria llamada "foo" cuyo valor debe satisfacer la expresión regular especificada), un filtro de tipo simple que determina el tipo del documento basándose en el contenido de la propiedad implícita "type" (es decir, la propiedad "type" de un documento debe ser "exampleDoc" para coincidir con este tipo de documento), y canales de documento que se construyen dinámicamente a partir del ID del documento.
Ahora crea un nuevo archivo llamado "generate-sync-function.sh" en el directorio raíz de tu proyecto:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
#!/bin/sh -e # Determina el directorio del script actual, para que pueda ejecutar comandos desde la raíz del proyecto sin importar desde dónde se ejecutó projectDir="$(dirname "$0")" # Aquí es donde se creará la función de sincronización generada outputDir="$projectDir/build" # Aquí es donde el paquete synctos fue descargado por npm synctosDir="$projectDir/node_modules/synctos" # Asegúrese de que existe el directorio de compilación mkdir -p "$outputDir" # Generar la función de sincronización a partir del fichero de definiciones de documentos "$synctosDir"/escriba a-sincronizar-función "$projectDir/mi-ejemplo-doc-definitions.js" "$outputDir/mi-ejemplo-de-funcion-sincronica.js" |
Este archivo se utilizará para generar la función de sincronización en el directorio "build" del proyecto como "my-example-sync-function.js". Asegúrate de que "generate-sync-function.sh" es ejecutable ejecutándolo:
|
1 |
chmod a+x generar-sincronizar-función.sh |
En este punto, tiene todo lo que necesita para generar una función de sincronización a partir del archivo de definiciones de documentos:
./generar-sinc-funcion.sh
Si busca en el directorio "build", encontrará un archivo de función de sincronización de Sync Gateway completamente formado llamado "my-example-sync-function.js". Si lo desea, puede insertar el contenido de la función de sincronización en un Sync Gateway archivo de configuración ahora. Al hacerlo, recuerde rodear la función de sincronización con comillas (`), ya que tiene más de una línea de longitud.
Ahora es el momento de validar esa función de sincronización. Crea un directorio llamado "test" en la raíz del proyecto y añade un archivo llamado "my-example-spec.js":
|
1 2 3 4 5 6 7 8 9 |
var testHelper = requiere('../node_modules/synctos/etc/test-helper.js'); var errorFormatter = testHelper.validationErrorFormatter; describa(mis definiciones de documentos de ejemplo, función() { // ¡Los casos de prueba van aquí! }); |
Este es el esqueleto del archivo de especificación. Las dos primeras líneas del archivo importan el módulo synctos test-helper y el formateador de mensajes de error, que facilitarán enormemente el proceso de escribir casos de prueba. El bloque "describe" englobará todo el código que añadamos en pasos posteriores.
A continuación, añada el siguiente fragmento dentro del bloque "describe" del archivo de especificaciones:
|
1 2 3 4 5 |
beforeEach(función() { testHelper.init('build/mi-ejemplo-sinc-funcion.js'); }); |
Este bloque garantiza que el módulo de ayuda para pruebas se reinicie al comienzo de cada caso de prueba (es decir, antes de cada caso) con el contenido de la función de sincronización generada.
Debajo del bloque "beforeEach" y aún dentro del bloque "describe", añade el siguiente caso de prueba:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
it(debe considerar válido el documento cuando se cumplan todas las restricciones"., función() { var doc = { _id: mi-documento-id, tipo: ejemploDoc, foo: bar } testHelper.verifyDocumentCreated(doc, [ "escribir + doc._id ]); }); |
Ahora estamos llegando a alguna parte. Aquí hemos definido el documento que nos gustaría probar y estamos afirmando que el documento puede ser creado porque cumple los criterios especificados por la definición del documento. El segundo parámetro de la función "verifyDocumentCreated" espera una lista completa de los canales del documento que se aceptan para la opción de escritura, lo que permite verificar que la lógica de asignación de canales de la definición del documento es correcta.
¿Y si el documento no es válido? Añade otro caso de prueba:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
it('debe considerar inválido un valor de foo que no tenga tres letras', función() { var doc = { _id: mi-documento-id, tipo: ejemploDoc, foo: inválido } testHelper.verifyDocumentNotCreated( doc, doc.tipo, [ errorFormatter.regexPatternItemViolation("foo, /^[a-z]{3}$/) ], [ "escribir + doc._id ]); }); |
Dado que la propiedad "foo" del documento no coincide con la expresión regular que se especificó en la definición del documento, esperamos que este documento sea rechazado. Algunas notas sobre los argumentos de la función "verifyDocumentNotCreated":
- Este es el documento sometido a prueba.
- Este es el nombre esperado del tipo de documento.
- Una lista completa de todos los errores que se esperan debido al fallo. Tenga en cuenta que el "errorFormatter" expone funciones de formateo para todos los tipos de error soportados.
- Una lista completa de los canales de documentos previstos que se aceptan para la operación de escritura. Como en el caso de prueba anterior, esto ayuda a verificar que se asignan los canales correctos al documento durante la operación.
Ahora que hay algunos casos de prueba, puede ejecutar el conjunto de pruebas ejecutando lo siguiente desde la raíz del proyecto:
|
1 |
npm prueba |
Verás que ambos casos de prueba se ejecutaron y pasaron (indicado por una marca de verificación verde junto a cada uno). Si alguna vez falla un caso de prueba, mocha (la herramienta de ejecución de pruebas) generará un mensaje de error detallado que debería ayudarte a averiguar dónde está el problema.
¿Y ahora qué? Hay mucho más que el módulo test-helper puede hacer para ayudarte a escribir tus especificaciones. La siguiente parada debería ser el módulo test-helper documentación para saber qué otras opciones están disponibles; en particular, descubrirás que también puedes verificar el comportamiento de tu función de sincronización cuando un documento es reemplazado o eliminado (práctico si tus documentos o sus propiedades deben ser inmutables). El formateador de mensajes de error de validación documentación también debería ser de gran ayuda para verificar los errores que se devuelven cuando se rechaza la revisión de un documento. Por último, encontrará el código fuente completo de estos ejemplos en GitHub.
¡Felices pruebas!