Отладчик Visualizer для генерации кода инициализатора объекта - PullRequest
12 голосов
/ 17 ноября 2010

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

Пока что я воспроизвел ошибку и в отладчике могу просмотреть значение времени выполнения сложного типа. Теперь мне нужно создать этот сложный тип в разделе «Упорядочить» моего модульного теста, чтобы я мог передать его в метод с ошибками в разделе «Акт» модульного теста.

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

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. В моем случае тип объекта является подклассом абстрактного базового класса. Просто хотел упомянуть об этом.

Ответы [ 3 ]

10 голосов
/ 22 февраля 2015

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

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

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

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

0 голосов
/ 14 марта 2011

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

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

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

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

0 голосов
/ 18 ноября 2010

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

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

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

В общем, проще всего сделать это вручнуюзапишите каждый сценарий: (* ​​1014 *

...