Другой вариант - перебирать атрибуты и возвращать значение атрибута с локальным именем, оканчивающимся на backgroundImage
.
Пример ...
from xml.etree import ElementTree as ET
XML = '''
<body xmlns:ttm="http://www.w3.org/ns/ttml#metadata"
xmlns:smpte="http://smpte-ra.org/schemas/2052-1/2013/smpte-tt">
<div region="imageRegion" xml:id="img_SUB6756004155_0"
ttm:role="caption" smpte:backgroundImage="#SUB6756004155_0"></div>
</body>'''
root = ET.fromstring(XML)
div = root.find("div")
val = next((v for k, v in div.attrib.items() if k.endswith('backgroundImage')), None)
if val:
print(f"Value: {val}")
Выходы ...
Value: #SUB6756004155_0
Это может быть хрупким, хотя. Он возвращает только первый найденный атрибут.
Если это проблема, возможно, используйте вместо этого список:
val = [v for k, v in div.attrib.items() if k.endswith('backgroundImage')]
Это также неправильно вернет атрибут, который заканчивается на «backgroundImage» (например, «invalid_backgroundImage»).
Если это проблема, возможно используйте вместо этого регулярное выражение:
val = next((v for k, v in div.attrib.items() if re.match(r".*}backgroundImage$", "}" + k)), None)
Если вы когда-нибудь сможете переключиться на lxml, тестирование локального имени можно выполнить в xpath ... [1113 ]
val = div.xpath("@*[local-name()='backgroundImage']")
Пружиной у Вас может быть модульный тест, который просто загружает прикладной контекст, ничего не утверждая. Это - на самом деле довольно полезный тест в сочетании с автоматической сборкой, так как пружина жалуется на большое количество проблем при загрузке полного контекста.
Так или иначе чувствует себя неправильным мне иметь контейнер МОК, работающий в моих тестовых проектах. Я также заметил, что большинство ошибок, которые вызываются зависимостями, не будучи разрешенным, вызывается порядком dependecies, разрешены, это очень твердо протестировать право и не является чем-то, что я хотел бы сделать как модульный тест.
Обычно я использую Отладку. Операторы контроля в стандартных программах инициализации моих классов. Это дает мне систему раннего оповещения для связанных с МОК ошибок и также помогает указать зависимости лучше в моем коде.
То, что я делаю с контейнером МОК Guice, то, что сначала я произвожу классы для некоторой функции с помощью TDD без Guice (это модульные тесты). Затем я создаю интеграционный тест на ту функцию с Guice. В той точке конфигурация МОК (Модуль Guice) является неполной, таким образом, интеграционный тест перестанет работать. Используя TDD, я добавляю конфигурацию МОК шаг за шагом до передач интеграционного теста. Я не добавлю @Inject аннотации, строки конфигурации или определю объем объявления, если это не потребуется, чтобы проходить тест. В результате у меня будет интеграция (или принятие) тестами, удостоверяясь, что конфигурация МОК является правильной и завершенной.
Этот тот же метод должен работать с любым контейнером МОК или другой системой, конфигурация которой так сложна, что это может повредиться - не пишут конфигурации, если это не, требуют, чтобы пройти тест.
@aku, @krosenvold и @mookid приводят убедительный аргумент в пользу тестирования, что конфигурация зависимостей корректна.
Я не думаю, что это - поблочное тестирование все же.
Что Вы тестируете? Вы не пробуете к модульному тесту сам контейнер (по-видимому, который не является кодом, который Вы написали или поддерживаете).
То, что Вы пытаетесь протестировать, - то, что все зависимости конкретного типа могут быть созданы и что тип может быть разрешен. Это походит на довольно полезное тестирование системы или интеграционный тест, чтобы иметь в Вашей непрерывной среде интеграции.
Таким образом, после того как у Вас есть двоичные файлы, которые передают модульный тест, можно создать контейнер и увеличить набор для контейнера на машине, которая зеркально отражает продуктивную среду, и протестируйте это каждый из типов, которые контейнер должен смочь разрешить, может на самом деле быть создан, и все их зависимости можно инстанцировать.
Было бы хорошо выполнить это в новом VM, к которому Вы применили свой последний установщик.
Так как Ваши компоненты могли бы иметь свои собственные зависимости или выполнить некоторую инициализацию, я покрою этот сценарий UTs.
Что-то как
iocContainer.Register(typeof(MyService1));
service = iocContainer.Get(typeof(MyService));
Debug.AssertNotNull(service);
Это может быть полезно, потому что некоторые платформы внедрения зависимости (как Единица) имеют странные правила для выбора который конструктор звонить. Я определенно рекомендовал бы поблочному тестированию удостовериться, регистрация и создание Вашего типа происходят успешно.
Я использую Виндзор в проекте MVC ASP.NET, где я записал простой тест, чтобы проверить, что все контроллеры можно инстанцировать (т.е. их зависимости могут быть разрешены).
У меня есть тест для каждой конфигурации веб-сайта (например, "разработка", "тест", "someProductionSite", и т.д.), где я создаю свой Виндзорский контейнер с той конкретной конфигурацией и циклом посредством всех неабстрактных реализаций IController, проверяя, что я могу разрешить экземпляр каждого.
Так как фабрика контроллера является единственной точкой входа в приложение, которое приведет к контейнеру. Твердость (...), я на 100% уверен, что все конфигурации действительны.
Обычно я нашел, что запись тестов, которые функционируют как утверждения обо всей системе, чрезвычайно полезна и ценна.
Например, Я также утверждаю, что все действия контроллера являются виртуальными, который является требованием, потому что я использую автоматическое управление транзакциями Замка для окружения действий контроллера транзакциями.
Ответьте на этот вопрос специально для Castle Windsor :
Castle Windsor: как проверить, что все зарегистрированные компоненты разрешимы?