2016-05-04 2 views
1

Этот вопрос основывается на одном я уже спросил:Свободно утверждения: Приблизительно сравнить свойства объектов, хранящихся в списках

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

Однако, это, кажется, пропустить примерно тест и требуют точного заказа. Возможно ли иметь точный порядок или любой порядок, чтобы приблизительно сравнить свойства объектов, содержащихся в списке?

ответ

3

Я знаю, это немного старый вопрос, но в любом случае, если кто-то натыкается на одной и той же проблемой:
Код внутри Using<double> не выполняется, так как сравнение путь выбранный элемент является неправильным. Вы сравнивая списки, поэтому путь будет выглядеть как-то вроде [0].X

Таким образом, вы можете это исправить с:

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

Или просто:

.WhenTypeIs<double>()); 

Точное упорядочение не требуется в ShouldBeEquivalentTo по умолчанию.

+0

Это работает, когда все свойства включены, хотя можно изменить 'When' так, чтобы сравнивались только выбранные свойства. Например, если я хочу приблизительно сравнить «X» и «Z», а не «Y» из двух списков. – Ayb4btu

+0

Итак, используйте '.When (info => info.SelectedMemberPath.EndsWith (" X ") || info.SelectedMemberPath.EndsWith (" Z "));' –

+0

Я пробовал это, но тест завершился неудачно: _Осмотренный элемент [0] .Y - 1, но найдено 1.0000001. Ожидаемый элемент [1] .Y равен 2, но найден 2.0000001. Ожидаемый элемент [2] .Y должен быть 0, но найден -1E-07._ Таким образом, он, похоже, не игнорирует «Y», и он все еще проверяет его, не используя приблизительно. – Ayb4btu