Библиотека Fluent Assertions уделяет особое внимание возможностям сравнения графов объектов с помощью метода Should().BeEquivalentTo
и связанных с ним методов. Как указывается в документации:
Should().BeEquivalentTo
- очень мощная функция и одна из уникальных торговых точек Fluent Assertions.
Из прочтения примеров я У меня создается впечатление, что граф объектов должен быть связан с помощью ссылок на объекты.
Теперь у меня есть множество графов объектов и деревьев, содержимое которых я хотел бы проверить, но они обычно загружаются из файлов или из баз данных. Поэтому соединение существует исключительно по значениям свойств идентификатора, которые совпадают между объектами.
Например, представьте себе эту простую структуру (здесь написано в формате JSON) - пример A:
[{
"Id": 1,
"Name": "Foo",
"NextId": 2
}, {
"Id": 2,
"Name": "Bar"
}]
Я хотел бы использовать Fluent Assertions для проверки структуры такого графа объектов. То есть, независимо от того, какие значения поля Id
и NextId
действительно имеют, NextId
в первом объекте должно иметь то же значение, что и Id
во втором объекте. Таким образом, подойдет любой набор из двух объектов с двумя различными значениями Id
, где один объект имеет значение NextId
, равное значению Id
другого объекта.
Пример B:
[{
"Key": 5,
"LinkedTo": [3]
}, {
"Key": 10,
"LinkedTo": []
}, {
"Key": 3,
"LinkedTo": [5]
}]
Здесь любой набор из трех объектов с тремя различными значениями Key
, где два объекта ссылаются на ключ друг друга в своем свойстве LinkedTo
, а оставшийся объект имеет пустой массив в свойстве LinkedTo
должны совпадать.
Пример C:
[{
"Id": 1,
"Owner": 4
}, {
"Id": 2,
"Owner": 4
}, {
"Id": 3,
"Owner": 4
}, {
"Id": 4
}]
Здесь любой набор из четырех объектов с тремя различными значениями Id
будет совпадать, если три из этих объектов имеют свойство Owner
значение которого соответствует свойству Id
оставшегося объекта.
Можно ли это как-то сделать с BeEquivalentTo
?
Обратите внимание, что я не хочу пройтись по моим объектам и добавить фактические ссылки на объекты перед применением каких-либо утверждений, потому что эта операция сама по себе может привести к собственным ошибкам.
РЕДАКТИРОВАТЬ: В соответствии с запросом, здесь есть пара подходящих и не соответствующие графики для приведенных выше примеров:
Пример A:
Соответствие:
[{
"Id": 5,
"Name": "Foo",
"NextId": -8
}, {
"Id": -8,
"Name": "Bar"
}]
Соответствие:
[{
"Id": 200,
"Name": "Bar"
}, {
"Id": 30,
"Name": "Foo",
"NextId": 200
}]
Несоответствие:
[{
"Id": 3,
"Name": "Bar",
"NextId": 6
}, {
"Id": 6,
"Name": "Foo"
}]
Пример B:
Совпадение:
[{
"Key": 20,
"LinkedTo": [7]
}, {
"Key": 8,
"LinkedTo": []
}, {
"Key": 7,
"LinkedTo": [20]
}]
Совпадение:
[{
"Key": 9,
"LinkedTo": [100]
}, {
"Key": 100,
"LinkedTo": [9]
}, {
"Key": 3,
"LinkedTo": []
}]
Несоответствие:
[{
"Key": 5,
"LinkedTo": [10]
}, {
"Key": 10,
"LinkedTo": []
}, {
"Key": 3,
"LinkedTo": [5]
}]
Пример C:
Соответствие:
[{
"Id": 1
}, {
"Id": 2,
"Owner": 1
}, {
"Id": 3,
"Owner": 1
}, {
"Id": 4,
"Owner": 1
}]
Соответствие:
[{
"Id": 10,
"Owner": 20
}, {
"Id": 30,
"Owner": 20
}, {
"Id": 20
}, {
"Id": 40,
"Owner": 20
}]
Несоответствие:
[{
"Id": 8,
"Owner": 2
}, {
"Id": 12,
"Owner": 8
}, {
"Id": 54,
"Owner": 2
}, {
"Id": 2
}]