{"id":3339,"date":"2017-04-24T03:28:42","date_gmt":"2017-04-24T10:28:42","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=3339"},"modified":"2025-06-13T19:58:33","modified_gmt":"2025-06-14T02:58:33","slug":"testing-sync-gateway-functions-synctos","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/es\/testing-sync-gateway-functions-synctos\/","title":{"rendered":"Pruebe las funciones de su Sync Gateway con synctos"},"content":{"rendered":"<p><em><u><a href=\"https:\/\/www.linkedin.com\/in\/andrewsjoel\" target=\"_blank\" rel=\"noopener\">Joel Andrews<\/a><\/u>\u00a0es un desarrollador pol\u00edglota que vive en la lluviosa costa oeste de Canad\u00e1. Desempe\u00f1a 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<a href=\"https:\/\/www.couchbase.com\/blog\/es\/developers\/\" target=\"_blank\" rel=\"noopener\">\u00a0<\/a><u><a href=\"https:\/\/www.couchbase.com\/blog\/es\/developers\/\" target=\"_blank\" rel=\"noopener\">Couchbase<\/a><\/u>\u00a0(especialmente<a href=\"https:\/\/www.couchbase.com\/blog\/es\/developers\/mobile\/\" target=\"_blank\" rel=\"noopener\">\u00a0<\/a><u><a href=\"https:\/\/www.couchbase.com\/blog\/es\/developers\/mobile\/\" target=\"_blank\" rel=\"noopener\">Couchbase M\u00f3vil<\/a><\/u>), lo que le hace totalmente imparcial a la hora de debatir los pros y los contras de cualquier soluci\u00f3n de almacenamiento de datos.<\/em><\/p>\n<p>En mi anterior <u><a href=\"https:\/\/www.couchbase.com\/blog\/es\/validating-your-sync-gateway-documents-with-synctos\/\" target=\"_blank\" rel=\"noopener\">entrada del blog<\/a><\/u>present\u00e9 <u><a href=\"https:\/\/www.npmjs.com\/package\/synctos\" target=\"_blank\" rel=\"noopener\">synctos<\/a><\/u>una pr\u00e1ctica herramienta de c\u00f3digo abierto que hemos creado y utilizamos en <u><a href=\"https:\/\/www.kashoo.com\/\" target=\"_blank\" rel=\"noopener\">Kashoo<\/a><\/u>\u00a0para facilitar el proceso de creaci\u00f3n de funciones de sincronizaci\u00f3n completas para Couchbase <u><a href=\"https:\/\/developer.couchbase.com\/documentation\/mobile\/current\/guides\/sync-gateway\/index.html\" target=\"_blank\" rel=\"noopener\">Pasarela de sincronizaci\u00f3n<\/a><\/u>. Casi al final de ese post alud\u00ed al hecho de que synctos incluye un m\u00f3dulo 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\u00f3digo\/configuraci\u00f3n en busca de errores, y tus definiciones de documentos de synctos no son diferentes.<\/p>\n<p>En este post te guiar\u00e9 a trav\u00e9s de lo que se necesita para empezar a escribir tus propias especificaciones\/casos de prueba. Antes de continuar, le sugiero que lea el <u><a href=\"https:\/\/www.couchbase.com\/blog\/es\/validating-your-sync-gateway-documents-with-synctos\/\" target=\"_blank\" rel=\"noopener\">puesto introductorio<\/a><\/u>si a\u00fan no lo has hecho, para asegurarte de que tienes una comprensi\u00f3n general de lo que es synctos y c\u00f3mo funciona.<\/p>\n<p>En primer lugar, tendr\u00e1 que instalar <u><a href=\"https:\/\/nodejs.org\/en\/download\/\" target=\"_blank\" rel=\"noopener\">Node.js<\/a><\/u>\u00a0para utilizar synctos. Una vez instalado, debe crear un directorio de proyecto vac\u00edo con un nuevo archivo llamado \"package.json\":<\/p>\n<pre class=\"lang:default decode:true\">{\r\n\r\n\u00a0 \"name\": \"synctos-test-examples\",\r\n\r\n\u00a0 \"devDependencies\": {\r\n\r\n\u00a0 \u00a0 \"expect.js\": \"^0.3.1\",\r\n\r\n\u00a0 \u00a0 \"mocha\": \"^3.2.0\",\r\n\r\n\u00a0 \u00a0 \"simple-mock\": \"^0.7.3\",\r\n\r\n\u00a0 \u00a0 \"synctos\": \"1.x\"\r\n\r\n\u00a0 },\r\n\r\n\u00a0 \"scripts\": {\r\n\r\n\u00a0 \u00a0 \"test\": \".\/generate-sync-function.sh &amp;&amp; node_modules\/.bin\/mocha\"\r\n\r\n\u00a0 }\r\n\r\n}\r\n\r\n<\/pre>\n<p>Este archivo indica al gestor de paquetes de Node.js (<u><a href=\"https:\/\/www.npmjs.com\/\" target=\"_blank\" rel=\"noopener\">npm<\/a><\/u>) qu\u00e9 dependencias necesitar\u00e1n synctos y sus casos de prueba: <u><a href=\"https:\/\/www.npmjs.com\/package\/expect.js\" target=\"_blank\" rel=\"noopener\">esperar.js<\/a><\/u>\u00a0para las afirmaciones de prueba,\u00a0<u><a href=\"https:\/\/www.npmjs.com\/package\/mocha\" target=\"_blank\" rel=\"noopener\">moca<\/a><\/u>\u00a0para ejecutar sus pruebas, y\u00a0<u><a href=\"https:\/\/www.npmjs.com\/package\/simple-mock\" target=\"_blank\" rel=\"noopener\">simple-mock<\/a><\/u>\u00a0para imitar o copiar funciones de la pasarela de sincronizaci\u00f3n <u><a href=\"https:\/\/developer.couchbase.com\/documentation\/mobile\/current\/guides\/sync-gateway\/sync-function-api-guide\/index.html\" target=\"_blank\" rel=\"noopener\">API de la funci\u00f3n de sincronizaci\u00f3n<\/a><\/u>. Tambi\u00e9n especifica el comando \"test\" que ejecutar\u00e1 sus pruebas con mocha.<\/p>\n<p>A continuaci\u00f3n, ejecute el siguiente comando desde la ra\u00edz del directorio de su proyecto para descargar los paquetes que necesita a su directorio local \"node_modules\":<\/p>\n<pre class=\"lang:default decode:true\">npm instalar<\/pre>\n<p>El proyecto necesitar\u00e1 algunas definiciones de documentos, as\u00ed que crea \"my-example-doc-definitions.js\" en el directorio ra\u00edz del proyecto:<\/p>\n<pre class=\"lang:default decode:true\">{\r\n\r\n\u00a0 exampleDoc: {\r\n\r\n\u00a0 \u00a0 typeFilter: simpleTypeFilter,\r\n\r\n\u00a0 \u00a0 channels: function(doc, oldDoc) {\r\n\r\n\u00a0 \u00a0 \u00a0 return {\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 write: [ 'write-' + doc._id ]\r\n\r\n\u00a0 \u00a0 \u00a0 }\r\n\r\n\u00a0 \u00a0 },\r\n\r\n\u00a0 \u00a0 propertyValidators: {\r\n\r\n\u00a0 \u00a0 \u00a0 foo: {\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 type: 'string',\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 required: true,\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 regexPattern: \/^[a-z]{3}$\/\r\n\r\n\u00a0 \u00a0 \u00a0 }\r\n\r\n\u00a0 \u00a0 }\r\n\r\n\u00a0 }\r\n\r\n}<\/pre>\n<p>Como puede ver, se trata de una definici\u00f3n de documento muy sencilla con fines de demostraci\u00f3n. Sus propias definiciones de documento ser\u00e1n sin duda m\u00e1s amplias y complejas, pero se aplican los mismos principios. El archivo define una \u00fanica propiedad del documento (una cadena obligatoria llamada \"foo\" cuyo valor debe satisfacer la expresi\u00f3n regular especificada), un filtro de tipo simple que determina el tipo del documento bas\u00e1ndose en el contenido de la propiedad impl\u00edcita \"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\u00e1micamente a partir del ID del documento.<\/p>\n<p>Ahora crea un nuevo archivo llamado \"generate-sync-function.sh\" en el directorio ra\u00edz de tu proyecto:<\/p>\n<pre class=\"lang:default decode:true\">#!\/bin\/sh -e\r\n\r\n# Determine the current script's directory, so it can execute commands from the root of the project no matter where it was run from\r\n\r\nprojectDir=\"$(dirname \"$0\")\"\r\n\r\n# This is where the generated sync function will be created\r\n\r\noutputDir=\"$projectDir\/build\"\r\n\r\n# This is where the synctos package was downloaded by npm\r\n\r\nsynctosDir=\"$projectDir\/node_modules\/synctos\"\r\n\r\n# Ensure the build directory exists\r\n\r\nmkdir -p \"$outputDir\"\r\n\r\n# Generate the sync function from the document definitions file\r\n\r\n\"$synctosDir\"\/make-sync-function \"$projectDir\/my-example-doc-definitions.js\" \"$outputDir\/my-example-sync-function.js\"<\/pre>\n<p>Este archivo se utilizar\u00e1 para generar la funci\u00f3n de sincronizaci\u00f3n en el directorio \"build\" del proyecto como \"my-example-sync-function.js\". Aseg\u00farate de que \"generate-sync-function.sh\" es ejecutable ejecut\u00e1ndolo:<\/p>\n<pre class=\"lang:default decode:true\">chmod a+x generate-sync-function.sh\r\n\r\n<\/pre>\n<p>En este punto, tiene todo lo que necesita para generar una funci\u00f3n de sincronizaci\u00f3n a partir del archivo de definiciones de documentos:<\/p>\n<p>.\/generar-sinc-funcion.sh<\/p>\n<p>Si busca en el directorio \"build\", encontrar\u00e1 un archivo de funci\u00f3n de sincronizaci\u00f3n de Sync Gateway completamente formado llamado \"my-example-sync-function.js\". Si lo desea, puede insertar el contenido de la funci\u00f3n de sincronizaci\u00f3n en un Sync Gateway <u><a href=\"https:\/\/developer.couchbase.com\/documentation\/mobile\/current\/guides\/sync-gateway\/config-properties\/index.html\" target=\"_blank\" rel=\"noopener\">archivo de configuraci\u00f3n<\/a><\/u>\u00a0ahora. Al hacerlo, recuerde rodear la funci\u00f3n de sincronizaci\u00f3n con comillas (`), ya que tiene m\u00e1s de una l\u00ednea de longitud.<\/p>\n<p>Ahora es el momento de validar esa funci\u00f3n de sincronizaci\u00f3n. Crea un directorio llamado \"test\" en la ra\u00edz del proyecto y a\u00f1ade un archivo llamado \"my-example-spec.js\":<\/p>\n<pre class=\"lang:default decode:true\">var testHelper = require('..\/node_modules\/synctos\/etc\/test-helper.js');\r\n\r\nvar errorFormatter = testHelper.validationErrorFormatter;\r\n\r\ndescribe('my example document definitions', function() {\r\n\r\n\u00a0 \/\/ Test cases go here!\r\n\r\n});<\/pre>\n<p>Este es el esqueleto del archivo de especificaci\u00f3n. Las dos primeras l\u00edneas del archivo importan el m\u00f3dulo synctos test-helper y el formateador de mensajes de error, que facilitar\u00e1n enormemente el proceso de escribir casos de prueba. El bloque \"describe\" englobar\u00e1 todo el c\u00f3digo que a\u00f1adamos en pasos posteriores.<\/p>\n<p>A continuaci\u00f3n, a\u00f1ada el siguiente fragmento dentro del bloque \"describe\" del archivo de especificaciones:<\/p>\n<pre class=\"lang:default decode:true\">beforeEach(function() {\r\n\r\n\u00a0 testHelper.init('build\/my-example-sync-function.js');\r\n\r\n});\r\n\r\n<\/pre>\n<p>Este bloque garantiza que el m\u00f3dulo 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\u00f3n de sincronizaci\u00f3n generada.<\/p>\n<p>Debajo del bloque \"beforeEach\" y a\u00fan dentro del bloque \"describe\", a\u00f1ade el siguiente caso de prueba:<\/p>\n<pre class=\"lang:default decode:true\">it('should consider the document valid when all constraints are met', function() {\r\n\r\n\u00a0 var doc = {\r\n\r\n\u00a0 \u00a0 _id: 'my-document-id',\r\n\r\n\u00a0 \u00a0 type: 'exampleDoc',\r\n\r\n\u00a0 \u00a0 foo: 'bar'\r\n\r\n\u00a0 }\r\n\r\n\u00a0 testHelper.verifyDocumentCreated(doc, [ 'write-' + doc._id ]);\r\n\r\n});<\/pre>\n<p>Ahora estamos llegando a alguna parte. Aqu\u00ed hemos definido el documento que nos gustar\u00eda probar y estamos afirmando que el documento puede ser creado porque cumple los criterios especificados por la definici\u00f3n del documento. El segundo par\u00e1metro de la funci\u00f3n \"verifyDocumentCreated\" espera una lista completa de los canales del documento que se aceptan para la opci\u00f3n de escritura, lo que permite verificar que la l\u00f3gica de asignaci\u00f3n de canales de la definici\u00f3n del documento es correcta.<\/p>\n<p>\u00bfY si el documento no es v\u00e1lido? A\u00f1ade otro caso de prueba:<\/p>\n<pre class=\"lang:default decode:true\">it('should consider a value of foo that is not three letters invalid', function() {\r\n\r\n\u00a0 var doc = {\r\n\r\n\u00a0 \u00a0 _id: 'my-document-id',\r\n\r\n\u00a0 \u00a0 type: 'exampleDoc',\r\n\r\n\u00a0 \u00a0 foo: 'invalid'\r\n\r\n\u00a0 }\r\n\r\n\u00a0 testHelper.verifyDocumentNotCreated(\r\n\r\n\u00a0 \u00a0 doc,\r\n\r\n\u00a0 \u00a0 doc.type,\r\n\r\n\u00a0 \u00a0 [ errorFormatter.regexPatternItemViolation('foo', \/^[a-z]{3}$\/) ],\r\n\r\n\u00a0 \u00a0 [ 'write-' + doc._id ]);\r\n\r\n});\r\n\r\n<\/pre>\n<p>Dado que la propiedad \"foo\" del documento no coincide con la expresi\u00f3n regular que se especific\u00f3 en la definici\u00f3n del documento, esperamos que este documento sea rechazado. Algunas notas sobre los argumentos de la funci\u00f3n \"verifyDocumentNotCreated\":<\/p>\n<ol>\n<li>Este es el documento sometido a prueba.<\/li>\n<li>Este es el nombre esperado del tipo de documento.<\/li>\n<li>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.<\/li>\n<li>Una lista completa de los canales de documentos previstos que se aceptan para la operaci\u00f3n de escritura. Como en el caso de prueba anterior, esto ayuda a verificar que se asignan los canales correctos al documento durante la operaci\u00f3n.<\/li>\n<\/ol>\n<p>Ahora que hay algunos casos de prueba, puede ejecutar el conjunto de pruebas ejecutando lo siguiente desde la ra\u00edz del proyecto:<\/p>\n<pre class=\"lang:default decode:true\">npm test<\/pre>\n<p>Ver\u00e1s que ambos casos de prueba se ejecutaron y pasaron (indicado por una marca de verificaci\u00f3n verde junto a cada uno). Si alguna vez falla un caso de prueba, mocha (la herramienta de ejecuci\u00f3n de pruebas) generar\u00e1 un mensaje de error detallado que deber\u00eda ayudarte a averiguar d\u00f3nde est\u00e1 el problema.<\/p>\n<p>\u00bfY ahora qu\u00e9? Hay mucho m\u00e1s que el m\u00f3dulo test-helper puede hacer para ayudarte a escribir tus especificaciones. La siguiente parada deber\u00eda ser el m\u00f3dulo test-helper <u><a href=\"https:\/\/github.com\/Kashoo\/synctos\/blob\/master\/etc\/test-helper.js\" target=\"_blank\" rel=\"noopener\">documentaci\u00f3n<\/a><\/u>\u00a0para saber qu\u00e9 otras opciones est\u00e1n disponibles; en particular, descubrir\u00e1s que tambi\u00e9n puedes verificar el comportamiento de tu funci\u00f3n de sincronizaci\u00f3n cuando un documento es reemplazado o eliminado (pr\u00e1ctico si tus documentos o sus propiedades deben ser inmutables). El formateador de mensajes de error de validaci\u00f3n <u><a href=\"https:\/\/github.com\/Kashoo\/synctos\/blob\/master\/etc\/validation-error-message-formatter.js\" target=\"_blank\" rel=\"noopener\">documentaci\u00f3n<\/a><\/u>\u00a0tambi\u00e9n deber\u00eda ser de gran ayuda para verificar los errores que se devuelven cuando se rechaza la revisi\u00f3n de un documento. Por \u00faltimo, encontrar\u00e1 el c\u00f3digo fuente completo de estos ejemplos en <u><a href=\"https:\/\/github.com\/OldSneerJaw\/synctos-test-examples\" target=\"_blank\" rel=\"noopener\">GitHub<\/a><\/u>.<\/p>\n<p>\u00a1Felices pruebas!<\/p>","protected":false},"excerpt":{"rendered":"<p>Synctos incluye un m\u00f3dulo incorporado de ayuda a las pruebas que le ayuda a escribir pruebas que validan sus definiciones de documentos. Siempre es una buena idea para poner a prueba su c\u00f3digo \/ configuraci\u00f3n de errores, y sus definiciones de documentos synctos no son diferentes.<\/p>","protected":false},"author":53,"featured_media":13873,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1810,2366],"tags":[],"ppma_author":[9026],"class_list":["post-3339","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-couchbase-mobile","category-sync-gateway"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.7.1 (Yoast SEO v25.7) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Testing your Sync Gateway functions with synctos - The Couchbase Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.couchbase.com\/blog\/es\/testing-sync-gateway-functions-synctos\/\" \/>\n<meta property=\"og:locale\" content=\"es_MX\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Testing your Sync Gateway functions with synctos\" \/>\n<meta property=\"og:description\" content=\"Synctos includes a built-in test-helper module that helps you to write tests that validate your document definitions. It&#039;s always a good idea to test your code\/configuration for bugs, and your synctos document definitions are no different.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/es\/testing-sync-gateway-functions-synctos\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2017-04-24T10:28:42+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-14T02:58:33+00:00\" \/>\n<meta name=\"author\" content=\"Laura Czajkowski, Developer Community Manager, Couchbase\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Laura Czajkowski, Developer Community Manager, Couchbase\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/testing-sync-gateway-functions-synctos\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/testing-sync-gateway-functions-synctos\/\"},\"author\":{\"name\":\"Laura Czajkowski, Developer Community Manager, Couchbase\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/5f1a0ece4e644bc8c037686fbc8f3220\"},\"headline\":\"Testing your Sync Gateway functions with synctos\",\"datePublished\":\"2017-04-24T10:28:42+00:00\",\"dateModified\":\"2025-06-14T02:58:33+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/testing-sync-gateway-functions-synctos\/\"},\"wordCount\":1050,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/testing-sync-gateway-functions-synctos\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"articleSection\":[\"Couchbase Mobile\",\"Sync Gateway\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/testing-sync-gateway-functions-synctos\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/testing-sync-gateway-functions-synctos\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/testing-sync-gateway-functions-synctos\/\",\"name\":\"Testing your Sync Gateway functions with synctos - The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/testing-sync-gateway-functions-synctos\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/testing-sync-gateway-functions-synctos\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"datePublished\":\"2017-04-24T10:28:42+00:00\",\"dateModified\":\"2025-06-14T02:58:33+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/testing-sync-gateway-functions-synctos\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/testing-sync-gateway-functions-synctos\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/testing-sync-gateway-functions-synctos\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"width\":1800,\"height\":630},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/testing-sync-gateway-functions-synctos\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Testing your Sync Gateway functions with synctos\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"name\":\"The Couchbase Blog\",\"description\":\"Couchbase, the NoSQL Database\",\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"width\":218,\"height\":34,\"caption\":\"The Couchbase Blog\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/5f1a0ece4e644bc8c037686fbc8f3220\",\"name\":\"Laura Czajkowski, Developer Community Manager, Couchbase\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/9deb07d5daaa00220534c31768bc4409\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/bc8eebaf25cbe39bc12fd7b1ef92550becc3953ab877a3f0285a59ec2d30b754?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/bc8eebaf25cbe39bc12fd7b1ef92550becc3953ab877a3f0285a59ec2d30b754?s=96&d=mm&r=g\",\"caption\":\"Laura Czajkowski, Developer Community Manager, Couchbase\"},\"description\":\"Laura Czajkowski is the Snr. Developer Community Manager at Couchbase overseeing the community. She\u2019s responsible for our monthly developer newsletter.\",\"url\":\"https:\/\/www.couchbase.com\/blog\/es\/author\/laura-czajkowski\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Testing your Sync Gateway functions with synctos - The Couchbase Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.couchbase.com\/blog\/es\/testing-sync-gateway-functions-synctos\/","og_locale":"es_MX","og_type":"article","og_title":"Testing your Sync Gateway functions with synctos","og_description":"Synctos includes a built-in test-helper module that helps you to write tests that validate your document definitions. It's always a good idea to test your code\/configuration for bugs, and your synctos document definitions are no different.","og_url":"https:\/\/www.couchbase.com\/blog\/es\/testing-sync-gateway-functions-synctos\/","og_site_name":"The Couchbase Blog","article_published_time":"2017-04-24T10:28:42+00:00","article_modified_time":"2025-06-14T02:58:33+00:00","author":"Laura Czajkowski, Developer Community Manager, Couchbase","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Laura Czajkowski, Developer Community Manager, Couchbase","Est. reading time":"5 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/testing-sync-gateway-functions-synctos\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/testing-sync-gateway-functions-synctos\/"},"author":{"name":"Laura Czajkowski, Developer Community Manager, Couchbase","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/5f1a0ece4e644bc8c037686fbc8f3220"},"headline":"Testing your Sync Gateway functions with synctos","datePublished":"2017-04-24T10:28:42+00:00","dateModified":"2025-06-14T02:58:33+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/testing-sync-gateway-functions-synctos\/"},"wordCount":1050,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/testing-sync-gateway-functions-synctos\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","articleSection":["Couchbase Mobile","Sync Gateway"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/testing-sync-gateway-functions-synctos\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/testing-sync-gateway-functions-synctos\/","url":"https:\/\/www.couchbase.com\/blog\/testing-sync-gateway-functions-synctos\/","name":"Testing your Sync Gateway functions with synctos - The Couchbase Blog","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/testing-sync-gateway-functions-synctos\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/testing-sync-gateway-functions-synctos\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","datePublished":"2017-04-24T10:28:42+00:00","dateModified":"2025-06-14T02:58:33+00:00","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/testing-sync-gateway-functions-synctos\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/testing-sync-gateway-functions-synctos\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/testing-sync-gateway-functions-synctos\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","width":1800,"height":630},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/testing-sync-gateway-functions-synctos\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Testing your Sync Gateway functions with synctos"}]},{"@type":"WebSite","@id":"https:\/\/www.couchbase.com\/blog\/#website","url":"https:\/\/www.couchbase.com\/blog\/","name":"El blog de Couchbase","description":"Couchbase, la base de datos NoSQL","publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"El blog de Couchbase","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","width":218,"height":34,"caption":"The Couchbase Blog"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/5f1a0ece4e644bc8c037686fbc8f3220","name":"Laura Czajkowski, Directora de la Comunidad de Desarrolladores, Couchbase","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/9deb07d5daaa00220534c31768bc4409","url":"https:\/\/secure.gravatar.com\/avatar\/bc8eebaf25cbe39bc12fd7b1ef92550becc3953ab877a3f0285a59ec2d30b754?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/bc8eebaf25cbe39bc12fd7b1ef92550becc3953ab877a3f0285a59ec2d30b754?s=96&d=mm&r=g","caption":"Laura Czajkowski, Developer Community Manager, Couchbase"},"description":"Laura Czajkowski es la Snr. Developer Community Manager en Couchbase supervisando la comunidad. Es responsable de nuestro bolet\u00edn mensual para desarrolladores.","url":"https:\/\/www.couchbase.com\/blog\/es\/author\/laura-czajkowski\/"}]}},"authors":[{"term_id":9026,"user_id":53,"is_guest":0,"slug":"laura-czajkowski","display_name":"Laura Czajkowski, Developer Community Manager, Couchbase","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/bc8eebaf25cbe39bc12fd7b1ef92550becc3953ab877a3f0285a59ec2d30b754?s=96&d=mm&r=g","first_name":"Laura","last_name":"Czajkowski","user_url":"","author_category":"","description":"Laura Czajkowski es la Snr. Developer Community Manager en Couchbase supervisando la comunidad. Es responsable de nuestro bolet\u00edn mensual para desarrolladores."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/3339","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/users\/53"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/comments?post=3339"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/3339\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media\/13873"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media?parent=3339"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/categories?post=3339"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/tags?post=3339"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/ppma_author?post=3339"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}