Отладчик 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
и т. д.... Это гораздо сложнее для непримитивных типов, потому что процесс становится рекурсивным, и вам необходимо учитывать циклы объектов.
Если это работает для вас, вот краткое руководство по визуализаторам отладчика.
В общем, может быть проще просто написать каждый сценарий:(