Ruby on Rails + Rspec: синтаксис для селектора css, содержащего переменную экземпляра

У меня есть тест rspec, в котором мне нужно специально найти блок div на индексной странице статей, соответствующий идентификатору статьи, и найти глификон, представляющий ссылку для уничтожения/редактирования и статьи. У меня есть список статей на индексной странице, поэтому мне нужно указать селектор css. Однако я не могу найти решение для этого. Я пробовал следующие методы:

1) Добавьте тег id к каждой статье в части статьи и вызовите конкретный div, используя «внутри»

часть статьи:

<div class = "row" id="<%= article.id %>" >
....more code....
</div>

spec/features/article_spec.rb

describe 'navigate' do

  let!(:user) { FactoryGirl.create(:user) }
  let!(:article)  { FactoryGirl.create(:article) }

  before do
    login_as(user, :scope => :user)
  end

  describe 'edit' do

    before do
      @article_to_edit = Article.create(title: 'Article to edit', summary: 'Summary of article to edit', description: 'Test to edit this article', user_id: user.id)
    end

    it 'edit and delete icon is visible to article owner from index page' do
      visit articles_path
      within '#{@article_to_edit.id}' do
        expect(page).to have_css('.glyphicon-pencil')
        expect(page).to have_css('.glyphicon-trash')
      end

    end

end

2) Замените блок "внутри" приведенным ниже кодом, чтобы найти конкретную ссылку href статьи

expect(page).to have_link('', href: "/articles/#{@article_to_edit.friendly_id}/edit")
expect(page).to have_link('', href: "/articles/#{@article_to_edit.friendly_id}")

person doyz    schedule 05.11.2017    source источник


Ответы (1)


Интерполяция Sting работает только внутри строк с двойными кавычками.

Просто измените

within '#{@article_to_edit.id}' do

to

within "#{@article_to_edit.id}" do

в примере кода, который вы разместили в своем вопросе. И сделайте то же самое в местах, где вы создаете URL-адреса с articles/#{@article_to_edit.friendly_id}...

person spickermann    schedule 05.11.2017
comment
Привет, спасибо работает. я изменил его на #article_#{@article_to_edit.id}, чтобы сделать его более конкретным и предотвратить проблемы с повторяющимися идентификаторами. Я столкнулся с другой проблемой, когда, поскольку я создал переменную экземпляра article_to_edit в операторе «до», идентификатор статьи увеличивается с каждым тестом, а это означает, что я не могу точно знать, какой фактический идентификатор статьи используется в этом тесте. Я подумал, что вызова @article_to_edit.id будет достаточно. - person doyz; 05.11.2017
comment
я отладил, поместив put page.html после visit_articles_path, и я вижу, что селектор css должен быть «# article_28», но тест выводит «# article_17». - person doyz; 05.11.2017
comment
Идентификаторы записей меняются в зависимости от вашей стратегии очистки базы данных и порядка, в котором выполняются ваши спецификации (обратите внимание, что random используется по умолчанию). Поэтому вам не следует полагаться на конкретные идентификаторы. Это сказало: что вы имеете в виду, что селектор #article_17, когда он должен быть #article_28. Почему он должен включать ID 28? Как вы проверяли? - person spickermann; 05.11.2017
comment
Мне удалось это исправить. Я был неосторожен и не указал статус переменной @article_to_edit, которая по умолчанию имеет значение черновик и, следовательно, не отображается на индексной странице статей. Теперь тест проходит. Еще одна неосторожная ошибка заключалась в том, что я не удалил некоторые операторы put page.html в других тестах и ​​запутал меня с идентификаторами. На самом деле, использование #article_#{@article_to_edit.friendly_id} для вывода строк заголовков вместо идентификаторов сделало мою ситуацию более понятной. - person doyz; 05.11.2017
comment
Потрясающий. Я рад, что смог помочь. - person spickermann; 05.11.2017