2016-05-04 10 views
1

Diese Frage baut ich vorher gefragt:Fluent Assertions: Vergleichen Ungefähr die Eigenschaften von Objekten in Listen gespeichert

Fluent Assertions: Approximately compare a classes properties

Wenn ich eine Klasse haben, sagen Vector3

public class Vector3 
{ 
    public double X { get; } 
    public double Y { get; } 
    public double Z { get; } 

    public Vector3(double x, double y, double z) 
    { 
     this.X = x; 
     this.Y = y; 
     this.Z = z; 
    } 
} 

und ist in zwei Listen gebildet, wie kann ich ungefähr die Eigenschaften der Vector3 Objekte in den beiden Listen vergleichen, um zu sehen, ob sie gleich sind. Das ist, was ich habe bisher (ich bin die xUnit Framework, aber das sollte keinen Unterschied machen):

public double precision = 1e-5; 

[Fact] 
public void ApproximatelyCompareVector3List() 
{ 
    // Arrange 
    var expectedList = new List<Vector3> 
    { 
     new Vector3(0.5, 1, 3), 
     new Vector3(0, 2, 4) 
    }; 

    // Act 
    var calculatedList = List<Vector3> 
    { 
     new Vector3(0.4999999, 1.0000001, 3), 
     new Vector3(0.0000001, 2.0000001, 4) 
    }; 

    //Assert 
    calculatedList.ShouldBeEquivalentTo(expectedList, options => options 
     .Using<double>(ctx => ctx.Subject.Should().BeApproximately(ctx.Expectation, precision)) 
     .When(info => info.SelectedMemberPath == "X" || 
         info.SelectedMemberPath == "Y" || 
         info.SelectedMemberPath == "Z")); 
} 

Dies scheint jedoch den etwa Test und erfordern eine genaue Ordnung zu überspringen. Ist es möglich, entweder die genaue Reihenfolge oder irgendeine Reihenfolge für den ungefähren Vergleich der Eigenschaften von Objekten in einer Liste zu haben?

Antwort

3

Ich weiß, es ist ein bisschen alt Frage, aber trotzdem, wenn jemand auf das gleiche Problem stolpert:
Der Code innerhalb Using<double> nicht ausgeführt, da ausgewählten Element Weg Vergleich falsch ist. Sie vergleichen Listen, das ist, warum der Weg, wie so etwas wie [0].X

aussehen So kann man es beheben mit:

.When(info => info.SelectedMemberPath.EndsWith("X") || 
        info.SelectedMemberPath.EndsWith("Y") || 
        info.SelectedMemberPath.EndsWith("Z"))); 

Oder einfach:

.WhenTypeIs<double>()); 

Genaue Bestellung nicht in erforderlich ist ShouldBeEquivalentTo standardmäßig.

+0

Das funktioniert, wenn alle Eigenschaften enthalten sind, obwohl es möglich ist, das 'When' zu ändern, sodass nur ausgewählte Eigenschaften verglichen werden. Zum Beispiel, wenn ich nur "X" und "Z" und nicht "Y" von den beiden Listen vergleichen möchte. – Ayb4btu

+0

Ok, also benutze '.When (info => info.SelectedMemberPath.Endswith (" X ") || info.SelectedMemberPath.Endswith (" Z "));' –

+0

Ich habe das versucht, aber der Test schlägt fehl mit: _Excepted item [0] .Y ist 1, aber gefunden 1.0000001. Erwarteter Artikel [1] .Y ist 2, hat aber 2.0000001 gefunden. Erwarteter Punkt [2] .Y ist 0, aber -1E-07._ So scheint es nicht zu sein, "Y" zu ignorieren, und es überprüft es immer noch, ohne ungefähr zu verwenden. – Ayb4btu