(Глубокое) сравнение объекта со ссылкой в ​​модульных тестах (C #) - PullRequest
6 голосов
/ 13 августа 2010

В модульном тесте (в Visual Studio 2008) я хочу сравнить содержимое большого объекта (точнее, список пользовательских типов) с сохраненной ссылкой на этот объект.Цель состоит в том, чтобы гарантировать, что любые последующие рефакторинги кода приведут к одному и тому же объектному содержимому.

Исключенная идея: Первой мыслью было сериализоваться в XML, а затем сравнить жестко закодированные строки или файлсодержание.Это позволит легко найти любую разницу.Однако, поскольку мои типы не могут быть XML-сериализуемыми без взлома, я должен найти другое решение.Я мог бы использовать двоичную сериализацию, но это больше не будет доступно для чтения.

Есть ли простое и элегантное решение для этого?

РЕДАКТИРОВАТЬ: В соответствии с предложением Марка Гравелла я теперь делаю так:

using (MemoryStream stream = new MemoryStream())
        {
            //create actual graph using only comparable properties
            List<NavigationResult> comparableActual = (from item in sparsed
                                                       select new NavigationResult
                                                       {
                                                           Direction = item.Direction,
                                                           /*...*/
                                                           VersionIndication = item.VersionIndication
                                                       }).ToList();

            (new BinaryFormatter()).Serialize(stream, comparableActual);
            string base64encodedActual = System.Convert.ToBase64String(stream.GetBuffer(), 0, (int)stream.Length);//base64 encoded binary representation of this                
            string base64encodedReference = @"AAEAAAD....";//this reference is the expected value
            Assert.AreEqual(base64encodedReference, base64encodedActual, "The comparable part of the sparsed set is not equal to the reference.");
        }

По сути, я сначала выбираю сопоставимые свойства, затем кодирую график, затем сравниваю его с аналогично закодированной ссылкой.Кодирование позволяет проводить глубокое сравнение простым способом.Причина, по которой я использую кодировку base64, заключается в том, что я могу легко сохранить ссылку на нее в строковой переменной.

Ответы [ 3 ]

5 голосов
/ 13 августа 2010

Я все равно был бы склонен использовать сериализацию. Но вместо того, чтобы знать двоичный файл, просто создайте ожидаемый граф, сериализуйте его. Теперь сериализуйте фактический график и сравните байты. Это полезно только для того, чтобы сказать вам, что - это разница; вам нужно осмотреть, чтобы найти что , что является болью.

1 голос
/ 13 августа 2010

Я бы заставлял каждый пользовательский тип наследовать IComparable и предоставлял методы равенства, которые сравнивали бы каждый пользовательский тип, а также делал основной класс ICompareble. Затем вы можете просто сравнить 2 объекта (если они есть в памяти при запуске модуля тесты) Если нет, то я бы предложил либо сериализацию, либо определение констант, которые, как вы ожидаете, будут иметь рефакторированный объект.

1 голос
/ 13 августа 2010

Я бы использовал хак для сравнения XML. Или вы можете использовать отражение для автоматического обхода свойств объекта (но при этом вы пройдете ВСЕ из них, в том числе некоторые, которые вам не нужны).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...