Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

299
Views
¿Cómo comparar las rutas de archivo de JsonConfigurationSources y Directory.GetFiles correctamente?

Creé un método de extensión para agregar todos los archivos de configuración JSON a IConfigurationBuilder

 public static class IConfigurationBuilderExtensions { public static IConfigurationBuilder AddJsonFilesFromDirectory( this IConfigurationBuilder configurationBuilder, IFileSystem fileSystem, string pathToDirectory, bool fileIsOptional, bool reloadConfigurationOnFileChange, string searchPattern = "*.json", SearchOption directorySearchOption = SearchOption.AllDirectories) { var jsonFilePaths = fileSystem.Directory.EnumerateFiles(pathToDirectory, searchPattern, directorySearchOption); foreach (var jsonFilePath in jsonFilePaths) { configurationBuilder.AddJsonFile(jsonFilePath, fileIsOptional, reloadConfigurationOnFileChange); } return configurationBuilder; } }

y quiere crear pruebas para ello usando xUnit. Residencia en

¿Cómo se burla del sistema de archivos en C# para pruebas unitarias?

Instalé los paquetes System.IO.Abstractions y System.IO.Abstractions.TestingHelpers y comencé a probar que se agregaron los archivos JSON de los directorios.

 public sealed class IConfigurationBuilderExtensionsTests { private const string DirectoryRootPath = "./"; private readonly MockFileSystem _fileSystem; public IConfigurationBuilderExtensionsTests() { _fileSystem = new MockFileSystem(new[] { "text.txt", "config.json", "dir/foo.json", "dir/bar.xml", "dir/sub/deeper/config.json" } .Select(filePath => Path.Combine(DirectoryRootPath, filePath)) .ToDictionary( filePath => filePath, _ => new MockFileData(string.Empty))); } [Theory] [InlineData("*.json", SearchOption.AllDirectories)] [InlineData("*.json", SearchOption.TopDirectoryOnly)] // ... more theories go here ... public void ItShouldAddJsonFilesFromDirectory(string searchPattern, SearchOption searchOption) { var addedJsonFilePaths = new ConfigurationBuilder() .AddJsonFilesFromDirectory(_fileSystem, DirectoryRootPath, true, true, searchPattern, searchOption) .Sources .OfType<JsonConfigurationSource>() .Select(jsonConfigurationSource => jsonConfigurationSource.Path) .ToArray(); var jsonFilePathsFromTopDirectory = _fileSystem.Directory.GetFiles(DirectoryRootPath, searchPattern, searchOption); Assert.True(addedJsonFilePaths.Length == jsonFilePathsFromTopDirectory.Length); for (int i = 0; i < addedJsonFilePaths.Length; i++) { Assert.Equal( jsonFilePathsFromTopDirectory[i], Path.DirectorySeparatorChar + addedJsonFilePaths[i]); } } }

Las pruebas están pasando, pero me gustaría saber si podría tener problemas al Path.DirectorySeparatorChar a addedJsonFilePaths[i] .

El problema es ese

  • jsonFilePathsFromTopDirectory[i] devuelve "/config.json"
  • addedJsonFilePaths[i] devuelve "config.json"

así que tengo que anteponer una barra al principio. ¿Tiene alguna sugerencia sobre cómo mejorar esto / evitar problemas posteriores?

over 4 years ago · Santiago Trujillo
3 answers
Answer question

0

La lógica de comparar archivos parece estar bien, no encuentro ningún problema destacado con ella, está bien anteponer el "/" para que coincida con lo que necesita. Podría ser aún mejor si también pudiera usar System.IO.Path.DirectorySeparatorChar para la ruta raíz del directorio, por lo que si ejecuta Windows o Linux, no tendrá problemas.

Pero puede haber un problema conceptual con lo que estás haciendo. Según tengo entendido, su objetivo es verificar la existencia de archivos de configuración específicos necesarios para que su programa funcione correctamente, si faltan esos archivos, el programa debería fallar. Pero ese tipo de falla debido a la falta de archivos de configuración es un resultado esperado y válido de su código. Sin embargo, realiza una prueba unitaria de esto como si los archivos faltantes fallaran la prueba, como si los archivos faltantes fueran una indicación de que algo anda mal con su código, esto está mal.

Los archivos que faltan no son una indicación de que su código no funciona correctamente y Unit-test no debe usarse como un validador para asegurarse de que los archivos existan antes de ejecutar el programa, probablemente estará de acuerdo en que unit-test no es parte del proceso real y solo debe tener como objetivo probar su código y no las condiciones previas, la prueba debe comparar un resultado esperado (resultado simulado de su código) con el resultado real y ciertamente no debe convertirse en parte del código. Esa prueba unitaria parece un validador que debería estar en el código.

Entonces, a menos que esos archivos sean producidos por su código específico (y no por la implementación), no tiene sentido probar eso. En tal caso, debe crear un código de validación de configuración, y su prueba de unidad podría probar eso en su lugar. Por lo tanto, probará que el validador esperaba el resultado con una entrada simulada que proporcione. Pero la cosa aquí es que sabría que solo está probando la lógica de validación y no la existencia real de los archivos.

over 4 years ago · Santiago Trujillo Report

0

En lugar de agregar el carácter separador de directorio usted mismo, puede usar System.IO.Path.Combine , que se encarga de eso; solo agrega uno si es necesario.

Nota al margen: dado que jsonFilePathsFromTopDirectory[i] devuelve /config.json con / en lugar de \ , podría considerar usar Path.AltDirectorySeparatorChar / en lugar de Path.DirectorySeparatorChar \ .
De cualquier manera, Path.Combine se ocupa de ambos.


Las dos declaraciones a continuación dan como resultado /config.json .

 Path.Combine(Path.AltDirectorySeparatorChar.ToString(), "/config.json"); Path.Combine(Path.AltDirectorySeparatorChar.ToString(), "config.json");

Su declaración de afirmación se vería así

 Assert.Equal( jsonFilePathsFromTopDirectory[i], Path.Combine(Path.AltDirectorySeparatorChar.ToString(), addedJsonFilePaths[i]) );
over 4 years ago · Santiago Trujillo Report

0

/config.json es una ruta absoluta y config.json es una ruta relativa, por lo que para compararlos debe convertir la ruta relativa en una ruta absoluta dándole un directorio.

Pero este no es el problema real, el documento no es lo suficientemente detallado (de hecho, no menciona esto en absoluto).

Cuando agrega una ruta mediante el método de extensión AddJsonFile , llamará automáticamente a FileConfigurationSource.ResolveFileProvider .

Si no se ha establecido ningún proveedor de archivos, para la ruta absoluta, esto creará un proveedor de archivos físicos para el directorio existente más cercano.

Este método convierte la ruta absoluta en una ruta relativa, es por eso que /config.json se convierte en config.json , la información del directorio se coloca en un proveedor de archivos generado automáticamente.

Entonces, para usar la API correctamente, necesita cambiar:

jsonConfigurationSource.Path

para:

jsonConfigurationSource.FileProvider.GetFileInfo(jsonConfigurationSource.Path).PhysicalPath

O puede proporcionar un FileProvider :

configurationBuilder.AddJsonFile(new NullFileProvider(), jsonFilePath, fileIsOptional, reloadConfigurationOnFileChange);

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!