Question

Je crée le test de l'unité qui devra comparer deux objets du même type d'évidence. J'ai décidé d'utiliser une bibliothèque SemanticComparison pour gérer cette tâche sans écrire le code de comparateur personnalisé. Cela fonctionne vraiment bien lors de la comparaison des objets plats, il y a des problèmes lorsque l'objet contient un objet imbriqué aussi à être comparé aux membres.

public class Outer
{
    public string Name { get; set; }
    public Inner Inner { get; set; }
}

public class Inner
{
    public string Name { get; set; }
    public string Value { get; set; }
}

public class Service
{
    public Outer Method()
    {
        return new Outer()
        {
            Name = "outerName",
            Inner = new Inner()
            {
                Name = "innerName",
                Value = "value1"
            }
        };
    }
}

Cela ne fonctionnera pas car l'objet intérieur est comparé par référence, non membre:

    [Test]
    public void SimpleTest1()
    {

        // setup
        var expectedLikeness = new Outer()
        {
            Name = "outerName",
            Inner = new Inner()
            {
                Name = "innerName",
                Value = "value1"
            }
        }.AsSource().OfLikeness<Outer>();

        var sut = new Service();
        // exercise sut
        var actual = sut.Method();
        // verify
        expectedLikeness.ShouldEqual(actual);
    }

Pour que cela fonctionne, je devais créer un proxy de l'objet imbriqué de manière à annuler la mise en œuvre par défaut.

    [Test]
    public void SimpleTest2()
    {

        // setup
        var expectedLikeness = new Outer()
        {
            Name = "outerName",
            Inner = new Inner()
            {
                Name = "innerName",
                Value = "value1"
            }.AsSource().OfLikeness<Inner>().CreateProxy()
        }.AsSource().OfLikeness<Outer>();

        var sut = new Service();
        // exercise sut
        var actual = sut.Method();
        // verify
        expectedLikeness.ShouldEqual(actual);
    }

Eh bien, cela fonctionne correctement, mais imaginez qu'après un refactoring du code de service, nous introduisons le bogue qui provoque la valeur de la valeur de la classe interne différente de la valeur attendue. La caractéristique froide du SemanticComparison est qu'il peut enregistrer le nom du membre qui provoque des inégalités. Mais dans ce cas, cela ne retournera que "intérieure" comme inadéquation, pas le nom de la propriété spécifique dans la classe intérieure.

Est-ce que je manque quelque chose? Est-il possible de la configurer pour pouvoir retourner un élément de désignation réel.

Ceci n'est évidemment pas un problème pour de simples structures de données, comme dans cet exemple, mais cela pourrait être un inconvénient pour tester un code de vie réel.

Était-ce utile?

La solution

Depuis personne n'a répondu, je vais fournir ma propre réponse.

Donc, il semble que vous ne puissiez pas le faire Ootb, à moins que vous n'ayez écrit de code supplémentaire. J'ai enveloppé le code dans l'ensemble de méthodes d'extension. Ces méthodes vous permettent de spécifier quelles propriétés internes / propriétés de collecte doivent être comparées à l'aide de la ressemblance intérieure, pas par référence. Vous n'avez pas besoin de créer des proxies manuellement, tout est traité interne par ces extensions. Et les résultats de toutes les comparaisons internes sont enregistrés, vous pouvez donc voir exactement quel membre a une valeur invalide.

Voici le test de la question avec l'utilisation de la méthode d'extension "innerlipité".

    [Test]
    public void ServiceTest3()
    {
        // setup
        var expected = new Outer()
        {
            Name = "outerName",
            Inner = new Inner()
            {
                Name = "innerName",
                Value = "value2"
            }
        };

        var expectedLikeness = expected.AsSource().OfLikeness<Outer>()
            .WithInnerLikeness(d => d.Inner, s => s.Inner)
            ;

        var sut = new Service();
        // exercise sut
        var actual = sut.Method();
        // verify
        expectedLikeness.ShouldEqual(actual);
    }

Vous pouvez voir que les propriétés de valeur des objets intérieurs ne correspondent pas, le test doit donc échouer. Et il échoue avec les messages suivants dans la sortie:

Comparing inner properties using likeness. Source: s => s.Inner Destination: d => d.Inner.
The source and destination values are not equal. Details: The provided value ClassLibrary1.Inner did not match the expected value ClassLibrary1.Inner. The following members did not match:
- Value.

Ploeh.SemanticComparison.LikenessException : The provided value ClassLibrary1.Outer did not match the expected value ClassLibrary1.Outer. The following members did not match:
- Inner.

Vous pouvez trouver le code source et plusieurs exemples sur GitHub.

https://github.com/jmansar/semanticComParisonextensions

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top