Как динамически загрузить страницу в Site Prism - PullRequest
0 голосов
/ 23 июня 2018

У меня есть страница статьи, страница новостей и страница комментариев, которые имеют некоторые общие элементы. На данный момент у меня есть различные шаги для загрузки и тестирования общих элементов следующим образом.

article_page.feature

Given I visit the Article page "Article title"
Then I should see the article title "Article title"
And I should see the summary "article summary"

article_steps.rb

Given('I visit the Article page {string}') do |title|
  article_page.load(slug: title.parameterize)
end

Then('I should see the article title {string}') do |title|
  expect(article_page).to have_content(title)
end

Then('I should see the summary {string}') do |summary|
  expect(article_page.summary.text).to eq(summary)
end

comment_page.feature

Given I visit the Comment page "Comment title"
Then I should see the comment title "Comment title"
And I should see the summary "comment summary"

comment_steps.rb

Given('I visit the Comment page {string}') do |title|
  comment_page.load(slug: title.parameterize)
end

Then('I should see the comment title {string}') do |title|
  expect(comment_page).to have_content(title)
end

Then('I should see the summary {string}') do |summary|
  expect(comment_page.summary.text).to eq(summary)
end

article.rb

module UI
  module Pages
    class Article < UI::Page
      set_url '/en/articles/{/slug}'

      element :summary, '.summary'
    end
  end
end

мир / pages.rb

module World
  module Pages
    def current_page
      UI::Page.new
    end

    pages = %w[article comment]

    pages.each do |page|
      define_method("#{page}_page") do
        "UI::Pages::#{page.camelize}".constantize.new
      end
    end
  end
end

World(World::Pages)

Это работает, но будет еще несколько страниц, и я хотел бы поделиться некоторыми из шагов. Я пробовал различные комбинации отправки метода загрузки с параметрами страницы и инициализации объекта Page.

shared_page_steps.rb

Given('I visit the {string} page {string}') do |page_type, title|
  page = "#{page_type}_page"
  send(:load, page, slug: title.parameterize)
end

article_page.feature

Given I visit the "Article" page "Article title"

comment_page.feature

Given I visit the "Comment" page "Comment title"

и я получаю ошибку cannot load such file -- article_page (LoadError)

я тоже пробовал

shared_page_steps.rb

Given('I visit the {string} page {string}') do |page_type, title|
  page = "#{page_type}"
  send(:load, page, slug: title.parameterize)
end

и я получаю ошибку cannot load such file -- article (LoadError)

и

shared_page_steps.rb

Given('I visit the {string} page {string}') do |page_type, title|
  page = "#{page_type}".classify.constantize
  @page = page.new.load(slug: title.parameterize)
end

и я получаю ошибку uninitialized constant Article (NameError)

Выглядит так, как будто send (: load) пытается загрузить файл, а не объект страницы. Когда я конвертирую строку в константу с classify.constantize, это тоже не работает, и мне интересно, нужно ли мне явно вызывать UI :: Pages :: Article или UI :: Pages :: Comment, но я не знаю как сделать это динамически.

Есть предложения?

1 Ответ

0 голосов
/ 22 февраля 2019

Как метод SitePrism #load, так и параметризация тщательно протестированы.

Если вы считаете, что существует проблема, не могли бы вы урезать свой вариант использования и поднять SSCCE здесь: https://github.com/natritmeyer/site_prism/issues -Постарайтесь сделать его как можно более обрезанным, в идеале - в какой-то форме клонируемого git-репо, чтобы упростить воспроизведение проблемы.

Поскольку вы метапрограммируете методы, возможно, есть ошибка вваша кодовая подпись, но это всего лишь быстрое наблюдение за 5с.Я думаю, что вы, вероятно, хотите сделать send("#{page}.load", *args) - но я не погрузился в достаточно

...