В моих тестах AJAX на Capybara + Webdriver я вижу такой код:
page.should have_selector('foo.bar > baz') # added dynamically by JS
visit current_page
page.should have_selector('foo.bar > baz') # still there after reload
Я извлек это в persist
вспомогательную функцию, которая делает
def persist
yield
visit current_page
yield
end
Вопрос: есть ли компактная идиома, позволяющая делать то же самое в линии без вспомогательной функции?
Самое короткое, что я смог придумать, это
2.times { |i|
page.should have_selector('foo.bar > baz')
visit current_page if i == 0
}
который СУХОЙ, но все еще безобразный.
Редактировать: Я думаю, что комментарий Марка совершенно правильный, и я придерживаюсь своего помощника persist
для этого конкретного варианта использования. Тем не менее, есть несколько хороших (и интересных) идей в ответах ниже.
Редактировать 2: В случае, если кто-то захочет скопировать мой persist
пример: с RSpec полезно поставить @__memoized = {}
после visit current_page
, чтобы обновить let удерживающие узлы, которые устаревают после перезагрузки страницы (иначе вы получите ObsoleteElementError
).