2016-04-22 11 views
3

ich eine Klasse Vector3D haben, die die Eigenschaften X, Y und Z Typ hat doppelt (es hat auch andere Eigenschaften wie Magnitude).Fließend Assertions: Vergleichen Ungefähr ein Klassen-Eigenschaften

Was ist der beste Weg, um alle Eigenschaften oder eine Auswahl der Eigenschaften mit Fluent Assertions in einer bestimmten Genauigkeit zu vergleichen?

Derzeit ist es wie dies zu tun habe ich:

calculated.X.Should().BeApproximately(expected.X, precision); 
calculated.Y.Should().BeApproximately(expected.Y, precision); 
calculated.Z.Should().BeApproximately(expected.Z, precision); 

Gibt es eine einzige Zeile Ansatz, der das Gleiche erreichen? Wie zum Beispiel ShouldBeEquivalentTo, oder erfordert dies die Konstruktion einer generischen Erweiterungsmethode, die das Einschließen/Ausschließen von Eigenschaften zulässt?

Antwort

3

Ja, es ist möglich mit ShouldBeEquivalentTo. Der folgende Code wird alle Eigenschaften überprüfen, die vom Typ Doppel mit einer Genauigkeit von 0,1:

double precision = 0.1; 
calculated.ShouldBeEquivalentTo(expected, option => options 
    .Using<double>(ctx => ctx.Subject.Should().BeApproximately(ctx.Expectation, precision)) 
    .WhenTypeIs<double>()); 

Wenn Sie nur die X vergleichen wollen, Y- und Z-Eigenschaften, die, wenn Einschränkung wie folgt zu ändern:

double precision = 0.1; 
calculated.ShouldBeEquivalentTo(b, options => options 
    .Using<double>(ctx => ctx.Subject.Should().BeApproximately(ctx.Expectation, precision)) 
    .When(info => info.SelectedMemberPath == "X" || 
        info.SelectedMemberPath == "Y" || 
        info.SelectedMemberPath == "Z")); 

ein weiterer Ansatz ist ausdrücklich FluentAssertions zu sagen, weichen Eigenschaften verglichen werden sollen, aber es ist ein bisschen weniger elegant:

double precision = 0.1; 
calculated.ShouldBeEquivalentTo(b, options => options 
    .Including(info => info.SelectedMemberPath == "X" || 
          info.SelectedMemberPath == "Y" || 
          info.SelectedMemberPath == "Z") 
    .Using<double>(ctx => ctx.Subject.Should().BeApproximately(ctx.Expectation, precision)) 
    .When(info => true)); 

Da die Using-Anweisung keine EquivalencyAssertionOptions<T> zurückgibt, müssen wir sie hacken, indem wir die When-Anweisung mit einem immer wahren Ausdruck aufrufen.

+0

Das ist ordentlich. Also muss '.When' in diesem speziellen Fall anstelle von' .Including' verwendet werden, um anzugeben, welche Eigenschaften für den Äquivalenztest verwendet werden? – Ayb4btu

+0

Einschließen ist, FluentAssertions ausdrücklich zu erklären, welche Eigenschaften während des Vergleichs zu verwenden sind. Ich habe meine Antwort mit einer Erklärung aktualisiert. –

+0

Ich vermute, es ist eine Frage der Präferenz, aber gibt es einen Nachteil bei der Verwendung von '.Inklusive (info => info.X) .Inklusive (info => info.Y) .Inklusive (info => info.Z) 'über den' info.SelectedMemberPath == "X" ... '? – Ayb4btu