Использование dynamic для быстрого создания Xml

от автора

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

Пример

dynamic rootTag = new XmlBuilder("Root", _nmsps); dynamic modelTag = new XmlBuilder("Model", _nmsps); dynamic elementTag = new XmlBuilder("ElementRef", _nmsps); dynamic attrTag = new XmlBuilder("ElementAttribute", _nmsps);   XDocument doc =                 rootTag(id: Guid.Empty,                 model: modelTag(id: model.ObjectId, name: model.Name,                                      e1: elementTag(id: er.ObjectId, name: elem1.Name,                                             ea1: attrTag(id: attr1.ObjectId, name: attr1.Name),                                            ea2: attrTag(id: attr2.ObjectId, name: attr2.Name)),                                      e2: elementTag(id: er2.ObjectId, name: elem2.Name)));  

XmlBuilder — самописный класс, наследующийся от DynamicObject.
Для создания документа он вызывается как метод и преобразует аргументы либо в атрибуты на основании имени параметра — если это аргумент любого типа, кроме XmlBuilder — либо в дочерние элементы (тут имя параметра не важно) — если это XmlBuilder.
При этом каждый XmlBuilder представляет некоторый тэг в результирующем документе.

В тесте сравниваем то, что надо с тем, что получилось, используя несложный компаратор, в итоге этот тест выглядит как-то так:

 //формируем входные данные для теста //...   //формируем документ, которому должен соответствовать результат dynamic rootTag = new XmlBuilder("Root", _nmsps); dynamic modelTag = new XmlBuilder("Model", _nmsps); dynamic elementTag = new XmlBuilder("ElementRef", _nmsps); dynamic attrTag = new XmlBuilder("ElementAttribute", _nmsps);   XDocument targetDocument =                 rootTag(id: Guid.Empty,                 model: modelTag(id: model.ObjectId, name: model.Name,                                      e1: elementTag(id: er.ObjectId, name: elem1.Name,                                             ea1: attrTag(id: attr1.ObjectId, name: attr1.Name),                                            ea2: attrTag(id: attr2.ObjectId, name: attr2.Name)),                                      e2: elementTag(id: er2.ObjectId, name: elem2.Name)));  //выполняем var resultDocument = TestableMethod(); //проверяем var _comparer = new XDocComparer(); Assert.IsTrue(_comparer.Equals(targetDocument, resultDocument)); 

Для простоты пришлось пожертововать ненужными для меня возможностями (декларациями, например).
Ну и компаратор, в силу того, что он есть IEqualityComparer, не показывает что именно не совпадает, а только конечный результат.

Тем не менее, реализация XmlBuilder тут, а реализация XDocComparer — тут, прошу пользоваться, если кому-то это может пригодиться.

ссылка на оригинал статьи http://habrahabr.ru/post/175051/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *