C# Тестирование - сравнить список пользовательских типов - PullRequest
0 голосов
/ 19 февраля 2020

Я пытаюсь написать тестовую проверку, если JSON конвертер принудительно десериализует ввод в мой пользовательский список

    [TestMethod]
    public void JSONInput_Changed()
    {
        List<PointOnChart> _expectedPointsOnChart;
        _expectedPointsOnChart = new List<PointOnChart>();
        _expectedPointsOnChart.Add(new PointOnChart { Timestamp = "2020-02-14T09:00:00.000Z", Value1 = 10, Value2 = 20, Value3 = 30 });
        _expectedPointsOnChart.Add(new PointOnChart { Timestamp = "2020-02-14T09:01:00.000Z", Value1 = 11, Value2 = 21, Value3 = 31 });
        _expectedPointsOnChart.Add(new PointOnChart { Timestamp = "2020-02-14T09:02:00.000Z", Value1 = 12, Value2 = 22, Value3 = 32 });
        _expectedPointsOnChart.Add(new PointOnChart { Timestamp = "2020-02-14T09:03:00.000Z", Value1 = 13, Value2 = 23, Value3 = 33 });

        MultipleBarChart multipleBarChartTest = new MultipleBarChart();
        multipleBarChartTest.MeInitialize(DateTimeIntervalType.Minutes);
        string JSONstring = System.IO.File.ReadAllText(@"C:\Users\slawomirk\source\repos\VIXCharts\iFixMultipleBarChartTests\TestJson.txt");
        multipleBarChartTest.JSONInput = JSONstring;
        List<PointOnChart> resultPointsOnChart = multipleBarChartTest.PointsOnChart;

        //bool areEqual = _expectedPointsOnChart.SequenceEqual(resultPointsOnChart);
        IEnumerable<PointOnChart> resultList;
        resultList = _expectedPointsOnChart.Except(resultPointsOnChart);
        if (resultList.Any())
        {
            Assert.Fail();
        }
    }

Список содержит объект этого класса

public class PointOnChart
{
    public string Timestamp { get; set; }
    public double Value1 { get; set; }
    public double Value2 { get; set; }
    public double Value3 { get; set; }
}

И это файл, который я читаю для десериализации:

[{"Метка времени": "2020-02-14T09: 00: 00.000Z", "Значение1": 10, "Значение2": 20, "Значение3 ": 30}, {" Отметка времени ":" 2020-02-14T09: 01: 00.000Z "," Значение1 ": 11," Значение2 ": 21," Значение3 ": 31}, {" Отметка времени ":" 2020- 02-14T09: 02: 00.000Z "," Value1 ": 12," Value2 ": 22," Value3 ": 32}, {" Timestamp ":" 2020-02-14T09: 03: 00.000Z "," Value1 " : 13, "Value2": 23, "Value3": 33}]

Я пробовал многочисленные способы сравнения двух списков, но все они терпят неудачу, например: - Свободное утверждение - CollectionAssert

Когда я проверяю оба List в отладке, они идентичны. Я знаю, что это, вероятно, тривиально, но я мог бы найти любое решение онлайн, заранее спасибо.

Ответы [ 3 ]

1 голос
/ 19 февраля 2020

Вы должны реализовать метод Equals для класса PointOnChart, что-то вроде этого:

public override bool Equals(object other)
{
    if (object.ReferenceEquals(other, this)) return true;

    var obj = other as PointOnChart;

    if (obj == null) return false;

    return this.Timestamp == obj.Timestamp && this.Value1 == obj.Value1 && this.Value2 == obj.Value2 && this.Value3 == obj.Value3;
}

Таким образом, метод расширения SequenceEquals будет работать правильно.

0 голосов
/ 19 февраля 2020

В дополнение к другим ответам я предлагаю реализовать IEquatable<T>, а также переопределить GetHashCode() и Equals(Object) следующим образом.

public class PointOnChart : IEquatable<PointOnChart> {

    public string Timestamp { get; set; }
    public double Value1 { get; set; }
    public double Value2 { get; set; }
    public double Value3 { get; set; }

    public override Int32 GetHashCode() => Timestamp.GetHashCode() ^ Value1.GetHashCode() ^ Value2.GetHashCode() ^ Value3.GetHashCode();

    public override Boolean Equals(Object obj) => Equals(obj as PointOnChart);

    public Boolean Equals(PointOnChart other) => other != null && other.Timestamp == Timestamp && other.Value1.Equals(Value1) && other.Value2.Equals(Value2) && other.Value3.Equals(Value3);

}

Это даст вам все сравнения, которые вы нужно. Также упростит реализацию IEqualityComparer или IEqualityComparer<T>, если вам потребуется позже.

0 голосов
/ 19 февраля 2020

Вместо того, чтобы загрязнять ваш производственный код переопределениями Equals, рассмотрите возможность использования www.fluentassertions.com и запишите это утверждение как:

resultPointsOnChart.Should().BeEquivalentTo(expectedPointsOnChart);

...