Probar funcionalidades que consumen archivos XML o JSON como entrada no es tarea sencilla. En este artículo reescribimos el enfoque aplicando principios de diseño orientado a objetos y características modernas de C sharp para crear pruebas unitarias ágiles de leer, rápidas y cómodas de mantener, todo con ejemplos pensados para C sharp.
Descripción del problema. La funcionalidad consiste en analizar una sección de configuración de una aplicación ASP.NET definida en archivos appsettings.json. El framework lee estos archivos mediante una instrucción típica de configuración y, a partir de ahí, accedemos a la configuración de múltiples formas. En nuestro caso, parsear la sección genera un objeto de mayor nivel y, sobre todo, en estado válido. Por ello la entrada más adecuada para las pruebas es un objeto IConfiguration del paquete Microsoft.Extensions.Configuration.Abstractions. Este objeto no es fácil de simular, pero Microsoft ofrece una alternativa excelente para tests: ConfigurationBuilder del paquete Microsoft.Extensions.Configuration permite crear una configuración en memoria desde un diccionario clave valor, evitando E/S de archivos y dependencias externas.
El inconveniente es que se pierde la estructura en árbol, ya que la ruta de cada clave se codifica en la propia clave separando niveles con dos puntos. Queremos construir la configuración con una sintaxis que se acerque al JSON real y que no requiera conocer esa codificación de rutas. El objetivo es representar algo como una sección AwsSecretManager con RegionName, SecretName, una subsección PartnerKeyName opcional con claves Login y Password que admiten valores por defecto, y otra subsección AwsCredentials con Source y credenciales, o bien con Source establecido en Environment sin claves adicionales.
La solución nace de la experimentación. Definimos una mini DSL en C sharp basada en dos ayudantes y un método final. Primero, un ayudante para valores simples que asocia clave y valor dentro de una sección. Segundo, un ayudante para secciones que acepta un nombre y una lista de entradas hijas, ya sean valores o subsecciones, de forma anidada y natural. Por último, un método para materializar todo en un IConfiguration listo para usar en los tests. Con esta sintaxis logramos varias ventajas. No hay que incrustar JSON en el código, lo que simplifica su lectura y mejora el rendimiento de las pruebas. La anidación es natural y refleja la jerarquía del JSON. La sintaxis es ligera, sin necesidad de new explícito ni de manejar llaves o corchetes. Y la intención es clara gracias al uso calificado de un espacio de nombres o clase de utilidades específica.
Diseño de la implementación. Centralizamos los ayudantes en una clase estática llamada Configuration para fomentar el uso calificado. El ayudante de valor crea una entrada con clave y valor. El ayudante de sección acepta el nombre de la sección y sus elementos hijos. Ambos devuelven el mismo tipo abstracto para poder componerlos entre sí. Para ello definimos una interfaz IEntries que representa una colección de entradas. De este modo, un conjunto de entradas se puede traducir fácilmente a un diccionario clave valor y después a IConfiguration mediante ConfigurationBuilder y AddInMemoryCollection. Implementamos un tipo de registro Entry con Key y Value que además se comporta como una colección de tamaño uno, lo que habilita el patrón Composite. Creamos también una clase privada que encapsula una enumeración de entradas y ofrece una operación Collect que aplana y transforma claves, anteponiendo el nombre de la sección al de cada entrada hija con el separador de rutas. Así, componer secciones anidadas consiste en combinar colecciones y reescribir claves de forma inmutable y segura.
Principios de diseño aplicados. Sin herencia innecesaria, favorecemos composición sobre herencia. Reutilizamos lógica con métodos predeterminados en la interfaz para evitar duplicación y mantener el código cohesionado. Encapsulamos detalles internos exponiendo solo lo imprescindible, de modo que podamos cambiar la implementación sin romper a los consumidores. Apostamos por la inmutabilidad usando records en C sharp, garantizando estados válidos y evitando corrupción accidental de claves. Y formalizamos la composición con el patrón Composite, lo que permite combinar entradas y secciones arbitrariamente sin complejidad adicional.
Conclusión. Este pequeño generador de configuración en memoria ofrece una forma robusta y flexible de construir IConfiguration en C sharp con un diseño claro, mantenible y muy orientado a pruebas. La inversión en una API así se traduce en suites de tests más fiables y fáciles de evolucionar en el tiempo.
En Q2BSTUDIO somos especialistas en desarrollo de software a medida y aplicaciones a medida, así como en ia para empresas, agentes IA, ciberseguridad, servicios cloud aws y azure, servicios inteligencia de negocio y power bi. Si necesitas construir herramientas internas como este builder de configuración, integrar secretos con proveedores cloud o reforzar tus pipelines de pruebas, nuestro equipo puede ayudarte de extremo a extremo. Descubre cómo transformamos ideas en productos escalables en nuestra página de software y aplicaciones a medida y, si tu proyecto se apoya en infraestructuras elásticas, consulta también nuestros servicios cloud en AWS y Azure.
Palabras clave recomendadas para mejorar el posicionamiento de este enfoque técnico y de nuestros servicios profesionales. aplicaciones a medida, software a medida, inteligencia artificial, ciberseguridad, servicios cloud aws y azure, servicios inteligencia de negocio, ia para empresas, agentes IA, power bi.