Как я могу заставить FluentAssertions ShouldBeEquivalentTo проверять тип при сравнении?

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

[Scenario]
public void DictionariesWithDifferentTypesShouldBeEquivalent(
    Dictionary<string, object> firstDictionary, 
    Dictionary<string, object> secondDictionary)
{
    "Given a dictionary"
        .f(() => firstDictionary = new Dictionary<string, object> 
                    {
                        { "latency", 0 },
                        { "errorMessages", new string[0] },
                        { "lastChanged", new DateTime(635272310930829706) },
                        { "query", new string[0] },
                        { "items", new string[] { "foo", "bar" } },
                        { "name", "Bob" },
                        { "number", 3 },
                        { "updateInterval", 10 },
                    });

    "And a second dictionary with same values but of differing types"
        .f(() => secondDictionary = new Dictionary<string, object> 
                    {
                        { "latency", 0L },
                        { "errorMessages", new object[0] },
                        { "lastChanged", new DateTime(635272310930829706) },
                        { "query", new string[0] },
                        { "items", new string[] { "bar", "foo" } },
                        { "name", "Bob" },
                        { "number", 3 },
                        { "updateInterval", "10" },
                    });

    "When I check for equivalency"
        .f(() => { });

    "Then the dictionaries should be equivalent"
        .f(() => firstDictionary.ShouldBeEquivalentTo(secondDictionary));
}

Если это ожидаемое поведение, как я могу настроить правило плавных утверждений, чтобы проверить соответствие типа?

Я исследовал использование как MatchingRule, так и AssertionRule, но в обоих случаях у меня, похоже, нет доступа к исходным типам субъекта и ожидаемым. Похоже, тема уже преобразована в ожидаемый вид. То есть в приведенном выше примере updateInterval в первом словаре уже был бы преобразован в строку для сравнения со вторым словарем.

Спасибо за помощь,
Рэйчел


person Rachael    schedule 11.06.2014    source источник
comment
Это по дизайну. По умолчанию выполняется рекурсивное структурное сравнение, которое игнорирует порядок элементов в коллекциях и пытается преобразовать фактические значения в ожидаемые. На каком конкретном пути он должен потерпеть неудачу?   -  person Dennis Doomen    schedule 13.06.2014
comment
Если вы не ответите на мой вопрос, я не смогу предложить вам решение.   -  person Dennis Doomen    schedule 14.07.2014
comment
Есть ли способ заставить сравнение учитывать типы? Например, WithStrictOrdering можно использовать, чтобы требовать, чтобы вложенные коллекции имели одинаковый порядок, изменяя поведение по умолчанию. Есть ли способ сказать, что вложенные объекты должны быть эквивалентны, включая их типы, чтобы, если у вас есть производный класс без дополнительных свойств, они считались бы неэквивалентными?   -  person fpintos    schedule 11.06.2016
comment
Это помогает? github.com/fluentassertions/fluentassertions/issues/   -  person arni    schedule 05.05.2020


Ответы (3)


Но они эквивалентны. Оба словаря содержат одни и те же ключи и значения, которые считаются эквивалентными. 0L и 0 могут быть преобразованы в один и тот же тип и поэтому эквивалентны. И для записи, ShouldBeEquivalentTo не выполняет проверку равенства ссылок persee. Но если тема и ожидание являются одним и тем же объектом, то да, можно с уверенностью предположить, что они эквивалентны.

person Dennis Doomen    schedule 10.07.2015

[Этому вопросу почти год, но я нашел его, когда искал ответ на тот же вопрос]

Позвольте мне немного изменить вопрос:

Как проверить тип с помощью FluentAssertions?

FluentAssertions «ShouldBeEquivelentOf» — это проверка ссылок, чтобы увидеть, являются ли объекты «одинаковыми» (byRef)

Правильный вызов FluentAssertions - это просто "Should().Be(...) as objectList.GetType().Should().Be(typeof(List<Classes.SomeListObject>));

person Cos Callis    schedule 13.05.2015

Версия 5.0.0-beta.1 библиотеки теперь поддерживает Should().BeEquivalentTo() без преобразования типов из коробки.

https://github.com/fluentassertions/fluentassertions/releases/tag/5.0.0-beta.1 https://github.com/fluentassertions/fluentassertions/pull/616

Вы можете включить преобразование типов, используя WithAutoConversion().

person KangarooWest    schedule 14.09.2017
comment
Я пытаюсь сравнить графики объектов и хочу, чтобы они использовали только значения свойств и имена классов. FA проходит с новым AbsoluteLink(path).Shold().BeEuivalentTo(new RelativeLink(path)) Я ожидаю, что он скажет, что имена классов не совпадают - person AxCoder; 10.03.2018