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

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

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

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

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, но это может сработать.

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

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

3 ответа

Решение

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

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

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

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам