5
votes

Méthode de test unitaire appelant IConfiguration.Obtenir l'extension

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.


0 commentaires

3 Réponses :


-1
votes
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Primitives;

1 commentaires

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.



16
votes

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.


0 commentaires

0
votes

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


0 commentaires