Методы сравнения структур объектов в Fluent Assertion - PullRequest
0 голосов
/ 26 февраля 2019

Я заметил, что в последнем пакете nuget (FluentAssertions -Version 5.6.0) я до сих пор не вижу метода ShouldBeEquivalentTo, который мог бы выполнять сравнение объектов без значения (ТОЛЬКО для структуры).Я могу видеть Should().BeEquivalentTo(), но не знаю, как сделать утверждение структуры объекта, кроме значений.

Мое решение включено .Net Core 2.1

Мой код:

[Fact]
        public void GetFlatTariffForOneProduct_ReturnSuccess()
        {
            this.Given(_ => _steps.GivenACorrelationIdHeaderIsProvided(true))
                .And(_ => _steps.TheFlatTariffRawDataInDb(1))
                .When(_ => _steps.WhenTheRequestExecutes(_endpoint, new EstimationRequestBuilder().FlatRateElecRequest().Build()))
                .Then(_ => _steps.TheResponseCodeIs(HttpStatusCode.OK))
                .And(_ => _steps.TheReturnedContentIs(new EstimationResponseBuilder().EstimateResponse(1).Build()))
                .BDDfy();
        }

Последний шаг вышеупомянутого называется методом ниже для утверждения объектной модели без данных.

public async Task TheReturnedContentIs<T>(T obj)
        {
            var responseString = await ResponseMessage.Content.ReadAsStringAsync();
            var deserializeObject = JsonConvert.DeserializeObject<T>(responseString);
            obj.Should().BeEquivalentTo(deserializeObject);

        }

Ожидаемый ответ:

{
    "attributeA": {
        "attribute2": "CITIPP",
        "attribute3": [
            {
                "attribute4": "Variable",
                "attribute5": {
                    "attribute6": 65.5022916666667,
                    "attribute7": 45.407291666666673,
                    "attribute8": 33.454791666666679
                }
            },
            {
                "attribute4": "Fixed",
                "attribute5": {
                    "attribute6": 21.8762916666667,
                    "attribute7": 89.432291666666673,
                    "attribute8": 90.236791666666679
                }
            }
        ]
    },
    "attributeB": {
        "attribute2": "CITIPP",
        "attribute3": [
            {
                "attribute4": "Variable",
                "attribute5": {
                    "attribute6": 71.5022916666667,
                    "attribute7": 53.407291666666673,
                    "attribute8": 62.454791666666679
                }
            },
            {
                "attribute4": "Fixed",
                "attribute5": {
                    "attribute6": 38.5022916666667,
                    "attribute7": 53.407291666666673,
                    "attribute8": 44.3684791666666679
                }
            }
        ]
    }
}

С утверждением ниже фактического ответадолжен пройти.Как вы заметили структура это же не значения.Но если любое из имен attribute отличается, утверждение должно завершиться неудачей.(например, если attributeA изменилось на attributeX в ответе)

Фактический ответ

{
    "attributeA": {
        "attribute2": "ABCD",
        "attribute3": [
            {
                "attribute4": "Variable",
                "attribute5": {
                    "attribute6": 71.5022916666667,
                    "attribute7": 53.407291666666673,
                    "attribute8": 62.454791666666679
                }
            },
            {
                "attribute4": "Fixed",
                "attribute5": {
                    "attribute6": 71.5022916666667,
                    "attribute7": 53.407291666666673,
                    "attribute8": 62.454791666666679
                }
            }
        ]
    },
    "attributeB": {
        "attribute2": "CITIPP",
        "attribute3": [
            {
                "attribute4": "Variable",
                "attribute5": {
                    "attribute6": 54.5022916666667,
                    "attribute7": 11.407291666666673,
                    "attribute8": 98.454791666666679
                }
            },
            {
                "attribute4": "Fixed",
                "attribute5": {
                    "attribute6": 71.222916666667,
                    "attribute7": 53.33291666666673,
                    "attribute8": 32.454791666666679
                }
            }
        ]
    }
}

Я передаю объектную модель описанному выше методу.Поэтому я ожидаю сравнить структуру объекта без значений.Причиной вышеупомянутого несостоятельности утверждения являются различия в стоимости.Структура соответствует идеально.

1 Ответ

0 голосов
/ 04 марта 2019

Что вы можете сделать, так это обойти два графа объектов, как обычно делает BeEquivalentTo, но игнорируя все строки и числовые типы, считая любые два экземпляра равными.

Вот пример, который должен это сделать.

T expected = JsonConvert.DeserializeObject<T>(expectedJSON);
T actual = JsonConvert.DeserializeObject<T>(actualJSON);

actual.Should().BeEquivalentTo(expected, opt => opt
    .Using<object>(_ => { })
    .When(e => e.RuntimeType.IsValueType)
    .Using<string>(_ => { })
    .WhenTypeIs<string>())

Подробнее в документации: https://fluentassertions.com/objectgraphs/#equivalency-comparison-behavior

...