Проблема "Неоднозначное совпадение, найдено 2 элемента, соответствующих видимой ссылке" - PullRequest
0 голосов
/ 07 января 2019

Я просмотрел несколько постов с той же проблемой, но все еще чувствую, что мое немного отличается.

viewing_categories_spec.rb

require 'rails_helper'

RSpec.feature 'Users can view categories' do
    scenario 'with the category details' do
        category = FactoryBot.create(:category, name: 'Real Estate')

        visit '/categories'
        click_link('Real Estate')
        expect(page.current_url).to eq category_url(category)
    end
end

category_factory.rb

FactoryBot.define do
    factory :category do
      name {"Computers"}
    end
end

когда я запускаю rspec, я получаю сообщение об ошибке:

Неудачи:

1) Пользователи могут просматривать категории с деталями категории Ошибка / Ошибка: ссылка клика («Недвижимость»)

 Capybara::Ambiguous:
   Ambiguous match, found 2 elements matching visible link "Real Estate"
 # ./spec/features/viewing_categories_spec.rb:8:in `block (2 levels) in <main>'

Затем я изменил спецификацию, добавив match: :first:

require 'rails_helper'

RSpec.feature 'Users can view categories' do
    scenario 'with the category details' do
        category = FactoryBot.create(:category, name: 'Real Estate')

        visit '/categories'
        click_link('Real Estate', match: :first)
        expect(page.current_url).to eq category_url(category)
    end
end

На этот раз я получил ошибку:

Failures:

  1) Users can view categories with the category details
     Failure/Error: expect(page.current_url).to eq category_url(category)

       expected: "http://www.example.com/categories/265"
            got: "http://www.example.com/categories/17"

       (compared using ==)
     # ./spec/features/viewing_categories_spec.rb:9:in `block (2 levels) in <main>'

Я заметил, что иногда я не вижу ошибки, а иногда она появляется.

Единственное, что я вижу всегда, это "http://www.example.com/categories/17". Эта часть остается неизменной всегда, когда я запускаю команду rspec.

Полный исходный код здесь https://github.com/tenzan/kaganat

1 Ответ

0 голосов
/ 07 января 2019

Тот факт, что URL-адрес "http://www.example.com/categories/17" является постоянным и что Capybara видит две ссылки" Недвижимость "на странице, когда ваш тест создает только одну, заставляет меня поверить, что у вас остались некоторые старые данные". в вашей тестовой базе данных. Выбрав match: :first, вы только что скрыли тот факт, что у вас больше записей, чем вы ожидаете, и эта ошибка должна была стать вашей первой подсказкой (наряду с простым просмотром скриншота запуска теста). ) Что-то вроде

rails db:reset RAILS_ENV=test

очистит вашу тестовую базу данных и обеспечит отсутствие старых данных. Вы также захотите вернуться к исходному click_link('Real Estate') без настройки: match. Кроме того, если вам нужны стабильные тесты, вы почти никогда не должны использовать стандартные средства сравнения RSpec ('eq' и т. Д.) С возвращаемыми объектами Capybara, поскольку загрузка / поведение страницы - это асинхронная вещь. Вместо этого вам следует использовать спички, предоставленные Capybara. В вашем текущем примере это означает, что вместо записи expect(page.current_url).to eq category_url(category) вы должны писать expect(page).to have_current_path(category_url(category))

...