Я использую SitePrism для тестирования своего веб-приложения. У меня есть несколько классов, которые проходят SitePrism::Page
и ряд часто используемых HTML-фрагменты представлены путем сопоставления классов простирающегося SitePrism::Section
Как добавить раздел к объекту страницы SitePrism динамически?
class Login < SitePrism::Section
element :username, "#username"
element :password, "#password"
element :sign_in, "button"
end
class Home < SitePrism::Page
section :login, Login, "div.login"
end
Проблема, приложение, я работаю над основана на CMS, в которую можно собрать, выбрав шаблон Template на основе предварительно определенного содержимого, а затем перетащив на страницу любое количество доступных компонентов.
Начальные разработчики создали объект Страница объекта для зеркального отображения всех доступных Шаблон. Это было прекрасно, пока количество тестов было низким, и не было слишком много вариантов страниц, которые мы должны были тестировать в наших файлах функций.
С добавлением нескольких тестовых примеров объекты страницы начали расти с угрожающей скоростью.
В то время как мы можем легко уменьшить дублирование кода путем определения разделов для каждого компонента, доступного в CMS и повторное использование их через страницу Объекты, там просто много свойств, которые редко привыкают.
class BlogPost < SitePrism::Page
section :logo, MySite::Components::Logo, '.logo'
section :navigation, MySite::Components::Navigation, '.primary-navigation'
section :header, MySite::Components::BlogHeader, '.header'
section :introduction, MySite::Components::Text, '.text .intro'
# and so on, a lot of dynamic staff that could potentially be dropped onto the page
# but does not neccessarily be there, going in dozens of lines
end
Есть ли способ в SitePrism динамически добавить раздел к экземпляру страницы объекта в отличие от целого класса?
Then(/^Some step$/) do
@blog = PageObjects::BlogPost.new()
@blog.load("some url")
@blog.somehow_add_a_section_here_dynamically
expect (@blog.some_added_section).to be_visible
end
Также меня беспокоит, что делать что-то подобное будет потенциально привести к CSS селекторы просочиться в ступенчатых определений, которые, как правило, плохая практика.
Другим способом обойти это было бы создание объектов страницы для конкретных примеров страниц в отличие от универсальных шаблонов. Объекты Template Page 0 могут содержать только то, что испечено в шаблонах, и расширяться другими объектами . Объекты, которые отражают определенные страницы, заботясь о различиях. Это похоже на гораздо более чистый подход, поэтому я, вероятно, собираюсь написать свои тесты таким образом
В любом случае, техническая часть вопроса стоит. Независимо от того, насколько это хорошо или плохо, как я могу динамически расширить объект страницы с помощью дополнительного раздела? Мне просто интересно.
Как уже упоминалось в самом вопросе. Я более склонен следить за шаблоном _page на странице_странице, а не _page-объектом на шаблон_. Я просто оставлю шаблоны базовыми классами или миксинами. Мне было просто любопытно, как это можно сделать с точки зрения метапрограмм в Ruby. – toniedzwiedz
Оказалось, интересно и интересно пересмотреть эту проблему; поэтому я рад, что вы его спросили :-) Я мог бы включить что-то подобное на моем развилке вперед. – tgf