Fluent断言:大致比较列表中存储的对象的属性

时间:2016-05-04 22:52:28

标签: c# unit-testing fluent-assertions

这个问题建立在我之前提出的问题之上:

Fluent Assertions: Approximately compare a classes properties

如果我有课,请说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;
    }
}

它形成了两个列表,我如何近似比较两个列表中Vector3个对象的属性,看它们是否相同。这就是我到目前为止(我使用xUnit框架,但这不应该有任何区别):

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

然而,这似乎跳过了近似测试并且需要精确排序。是否可以使用精确排序或任何排序来近似比较列表中包含的对象的属性?

1 个答案:

答案 0 :(得分:3)

我知道这是一个有点老问题,但无论如何,如果有人偶然发现同样的问题:
Using<double>内的代码未执行,因为所选成员路径比较错误。您正在比较列表,这就是路径看起来像[0].X

的原因

所以你可以用以下方法修复它:

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

或者只是:

.WhenTypeIs<double>());

默认情况下ShouldBeEquivalentTo不需要精确排序。