Fluent Assertions: Approximately compare a classes properties

前端 未结 1 1887
青春惊慌失措
青春惊慌失措 2021-01-04 06:34

I have a class Vector3D that has the properties X, Y and Z of type double (it also has other properties such as Mag

相关标签:
1条回答
  • 2021-01-04 07:15

    Yes it's possible using ShouldBeEquivalentTo. The following code will check all properties that are of type double with a precision of 0.1 :

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

    If you want to compare only the X, Y and Z properties change the When constraint like this :

    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"));
    

    Another approach is to explicitly tell to FluentAssertions which properties should be compared, but it's a bit less 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));
    

    Since the Using statement does not return a EquivalencyAssertionOptions<T> we need to hack it by calling the When statement with an always true expression.

    0 讨论(0)
提交回复
热议问题