Этот вопрос основывается на одном я уже спросил:Свободно утверждения: Приблизительно сравнить свойства объектов, хранящихся в списках
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"));
}
Однако, это, кажется, пропустить примерно тест и требуют точного заказа. Возможно ли иметь точный порядок или любой порядок, чтобы приблизительно сравнить свойства объектов, содержащихся в списке?
Это работает, когда все свойства включены, хотя можно изменить 'When' так, чтобы сравнивались только выбранные свойства. Например, если я хочу приблизительно сравнить «X» и «Z», а не «Y» из двух списков. – Ayb4btu
Итак, используйте '.When (info => info.SelectedMemberPath.EndsWith (" X ") || info.SelectedMemberPath.EndsWith (" Z "));' –
Я пробовал это, но тест завершился неудачно: _Осмотренный элемент [0] .Y - 1, но найдено 1.0000001. Ожидаемый элемент [1] .Y равен 2, но найден 2.0000001. Ожидаемый элемент [2] .Y должен быть 0, но найден -1E-07._ Таким образом, он, похоже, не игнорирует «Y», и он все еще проверяет его, не используя приблизительно. – Ayb4btu