Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

308
Visualizações
¿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 Respostas
Responde à pergunta

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 Relatório

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 Relatório

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda