Laden...

Unit Test von Linq Abfrage mit Fluent Assertions

Erstellt von OXO vor einem Jahr Letzter Beitrag vor einem Jahr 793 Views
O
OXO Themenstarter:in
86 Beiträge seit 2020
vor einem Jahr
Unit Test von Linq Abfrage mit Fluent Assertions

Hallo,

ich habe ein Array und eine Liste mit unterschiedlichem Aufbau. In einem Test möchte ich sicherstellen, dass alle Daten aus dem Array auch in der Liste enthalten sind.
Da es in einem Test läuft, muss es nachtürlich wirken, wie ein Assert. Dazu hatte ich einen Linq-Ausdruck gemacht, der in einer Schleife über das Array und unter Verwendung von ..Should().Be(..) in der Liste fragt, ob das Element vorhanden ist.

Kann man im Fall, dass innerhalb der Verundung des Linq-Ausdrucks eine Property abweicht, ein Kriterium (z.B. x.A == array.A && x.B == array.B && ...) also nicht stimmt, dann auch ausgeben kann, wo es abweicht, also so z.B. x.B == array.B den Unterschied hatte, so dass das Should-Nicht erfüllt werden konnte?

16.825 Beiträge seit 2008
vor einem Jahr

Du kannst das machen, was Should Dir hier ermöglicht.
Wenn Du eine Abfrage wie


array.A && x.B == array.B && 

hast, was eine simple Condition darstellt, dann kennt hier Should auch nur die Condition (als Expression) - und nicht die Property (also den Inhalt).
Du musst einfach jede Property einzeln überprüfen, ohne "Verundung". Nur dann hat der Should-Kontext auch mehr Infos als nur eine Condition und Du kannst einzelne Fehlermeldung erhalten/selbst setzen.

Hellsehen kann Fluent Assertions leider auch nicht 😉
Das steht auch irgendwo in den Recommendations von Fluent Assertions.

O
OXO Themenstarter:in
86 Beiträge seit 2020
vor einem Jahr

Hallo Abt,

genau so hatte ich mir das auch schon gedacht 😉
Aber wenn ich einzelne Shoulds habe, dann fällt an sich ja die Verundung weg? Also es könnte sein, dass ein Eintrag ein einzelnes x.B drin hat, was ein anderer auch hat. Nur nicht in der richtigen Kombination. Es müsste da schon sein, dass irgendwie alle Kriterien.

Wäre fast so, als ob ich eine Hintereinanderreihung von mehreren Shoulds brauche (mit Punkt getrennt), was aber wohl nicht zu gehen scheint.

16.825 Beiträge seit 2008
vor einem Jahr

Das ist korrekt. Da bleibt Dir nur das Nutzen von Alternativen, zB via Match oder anonyme Objekte.


response.Should()
        .Match<MyObject>( x => 
            x.Property1 == "abc" && 
            x.Property2 == "xyz"
        );

response.BeEquivalentTo( new { 
            Property1 = "abc",
            Property2 = "xyz"
        }, options => options.ExcludingMissingMembers());

Die Fehlermeldung beider Tests sind aber sehr mager, weil Expressions halt nicht mehr hergeben.
So funktioniert das System halt drunter, und schwarze Magie kann da FA nicht anwenden.

Mehr wird Dir da nicht möglich sein, ausser eigene AssertionProvider zu schreiben.
https://fluentassertions.com/extensibility/

O
OXO Themenstarter:in
86 Beiträge seit 2020
vor einem Jahr

Okay, dann muss ich mich wohl erst einmal damit zufrieden geben 😉
Vielen Dank für Deine Hilfe!