Отладчик Visualizer для генерации кода инициализатора объекта

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

До сих пор я воспроизвел ошибку, и в отладчике можно просмотреть значение времени выполнения сложного типа. Теперь мне нужно создать этот сложный тип в разделе "Упорядочить" моего unit test, чтобы я мог подавать его на метод багги в разделе "Действие" unit test.

Я могу написать блок кода инициализатора большого объекта вручную, например, следующий:

var cats =
    new List<Cat>
        {
            new Cat {Name = "Sylvester", Age = 8},
            new Cat {Name = "Whiskers", Age = 2}
        };

или даже что-то вроде этого:

var cats = new List<Cat>();
var cat1 = new Cat();
cat1.Name = "Sylvester";
cat1.Age = 8;
cats.Add(cat1);
var cat2 = new Cat();
cat2.Name = "Whiskers";
cat2.Age = 2;
cats.Add(cat2);

Ничего особенного. Единственная проблема - это "рука" - сложный тип в моем случае не так уж и тривиален, как в приведенном выше примере.

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

Другой вариант - написать специальную реализацию сериализации, которая "сериализует" код блока инициализации объекта. Использовать это было бы немного сложнее, чем просто потянуть окно QuickWatch, но это может сработать.

Прежде чем сам решить эту проблему, кто-нибудь сделал что-то подобное? Ум разделяет фрагмент кода? Или кто-нибудь предложит другой подход?

P.S. В моем случае тип объекта является подклассом абстрактного базового класса. Просто хотел сказать об этом.

Ответ 1

Эти предложения не будут работать. Прочитайте первую строку:

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

http://msdn.microsoft.com/en-us/library/e2zc529c.aspx

Есть ваш ответ. Если я правильно читаю, он не может быть реализован с помощью визуализатора. Тип хрома.

Ответ 2

Вот инструмент Object Exporter, который выполняет именно то, что вы ищете, он будет генерировать код инициализации С# из любого объекта в ваших отладочных окнах:

https://visualstudiogallery.msdn.microsoft.com/c6a21c68-f815-4895-999f-cd0885d8774f

Сообщение в блоге с дополнительной информацией:

http://www.omarelabd.net/exporting-objects-from-the-visual-studio-debugger/

Ответ 3

Я не знаю ни одной существующей функции/функциональности, которая обеспечивает поведение, которое вы ищете. Но идея написания Visualizer для генерации кода для данного объекта кажется звуковой для простых типов объектов: те, которые состоят из свойств примитивных типов. Как только вы выходите за рамки этого, задача становится все труднее.

В визуализаторе у вас будет доступ к рассматриваемому объекту и вы можете использовать трюки, такие как отражение, чтобы попасть в члены. Повторение значения члена как кода для примитивных типов легко: int, string и т.д. Это намного сложнее для не-примитивных типов, потому что процесс становится рекурсивным, и вам нужно рассмотреть циклы объектов.

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

В общем, может быть проще просто написать каждый сценарий: (