J'ai cette méthode très simple dont j'ai besoin pour effectuer un test unitaire.
public static class ValidationExtensions { public static T GetValid<T>(this IConfiguration configuration) { var obj = configuration.Get<T>(); Validator.ValidateObject(obj, new ValidationContext(obj), true); return obj; } }
Le problème est que configuration.Get
est une méthode d'extension statique et n'appartient pas à IConfiguration
. Je ne peux pas changer l'implémentation de cette méthode statique.
Je pense que le moyen le plus simple est peut-être de créer un fournisseur de configuration de mémoire? Mais je ne sais pas si je peux en créer un sans le lier à un hébergeur.
3 Réponses :
using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Primitives;
C'est ma première tentative, mais non. Get est une méthode d'extension statique qui fait partie de ConfigurationBinder, ne fait pas partie d'IConfiguration. Moq ne m'aide donc pas.
Le module de configuration est indépendant des fonctionnalités liées à l'hôte Web.
Vous devriez être en mesure de créer une configuration en mémoire à tester sans avoir besoin de la lier à un hôte Web.
Passez en revue l'exemple de test suivant
public class TestConfig { [Required] public string SomeKey { get; set; } [Required] //<--NOTE THIS public string SomeOtherKey { get; set; } } //... [Fact] public void Should_Fail_Validation_For_Required_Key() { //Arrange var inMemorySettings = new Dictionary<string, string> { {"Email:SomeKey", "value1"}, //{"Email:SomeOtherKey", "value2"}, //Purposely omitted for required failure //...populate as needed for the test }; IConfiguration configuration = new ConfigurationBuilder() .AddInMemoryCollection(inMemorySettings) .Build(); //Act Action act = () => configuration.GetSection("Email").GetValid<TestConfig>(); //Assert ValidationException exception = Assert.Throws<ValidationException>(act); //...other assertions of validation results within exception object }
Cela, à mon avis, serait proche d'un test d'intégration, mais idéalement, vous utilisez simplement des fonctionnalités dépendant du framework dans afin d'isoler le test de la méthode d'extension.
Une manière légèrement différente de résoudre le problème, en évitant Mock et beaucoup de bruit de configuration:
L'InMemoryConfiguration presque m'a donné ce dont j'avais besoin, alors je l'ai étendu pour que vous puissiez modifier les valeurs après la construction de la configuration (situation que j'avais, je ne connaissais pas toutes les valeurs simulées au moment de construction de la configuration)
https://gist.github.com/martinsmith1968/9567de76d2bbe537af05d76eb39b1162
Le test unitaire en bas montre l'utilisation