Маршруты увеличиваются, когда я запускаю функцию Rspec

Итак, по какой-то причине мои маршруты увеличиваются на 11, когда я запускаю тест функции комментариев.

Экспонат A: я нажал «Сохранить» на своем comment_spec.rb

RSpec.feature "Adding comments to movies" do

before do 
@kyle = Admin.create(email: "[email protected]", password: "password")
@jill = Member.create(email: "[email protected]", password: "password")


@movie = Movie.create!(title: "First movie", synopsis: "Synopsis of first  movie", year_released: '2000', admin: @kyle)
end

scenario "permits a signed in member to write a comment" do

login_as(@jill, scope: :member)

visit "/"

click_link @movie.title
fill_in "New Review", with: "An awesome movie"
click_button "Add Review"

expect(page).to have_content("Review has been created")
expect(page).to have_content("An awesome movie")
# must implement a nested route in order for this to work.
expect(current_path).to eq(movie_path(@movie.comments.last.id))
end

end

Тогда тест проходит

moviesmoviesmovies/spec/features/comments_spec.rb:3)

Завершено за 0,99879 секунды (загрузка файлов заняла 2,4 секунды) 1 пример, 0 сбоев

Теперь я нажимаю Enter в терминале и получаю это:

Adding comments to movies permits a signed in member to write a comment
Failure/Error: expect(current_path).to eq(movie_path(@movie.comments.last.id))

expected: "/movies/2"
  got: "/movies/4"

(compared using ==)
# ./spec/features/comments_spec.rb:26:in `block (2 levels) in <top (required)>'

Затем я снова сохраняю comment_spec.rb и получаю следующее:

Adding comments to movies permits a signed in member to write a comment
Failure/Error: expect(current_path).to eq(movie_path(@movie.comments.last.id))

   expected: "/movies/3"
        got: "/movies/15"

(compared using ==)
 # ./spec/features/comments_spec.rb:26:in `block (2 levels) in <top (required)>'

После этого я запускаю:

bundle exec rails db:test:prepare

Затем тесты снова проходят, но вышеописанное повторяется. Что в мире делает это возможным? хаха, а на самом деле?

Мой GitHub, если необходимо.


person kyle    schedule 30.04.2016    source источник


Ответы (1)


Проблема, с которой вы столкнулись, заключается в том, что ваша база данных не сбрасывается после каждого функционального теста, как вы, вероятно, ожидаете. В частности, проблема связана с Capybara и строкой config.use_transactional_fixtures = true, которая установлена ​​в вашей конфигурации спецификации.

Capybara эффективно тестирует ваше приложение как внешний процесс с помощью виртуального браузера. Это означает, что ваши тесты капибары отображают только поведение вашего приложения на стороне клиента (то есть переменную page). Другими словами, с точки зрения Capybara ваше приложение является «черным ящиком». Поэтому капайбара не видит объекты контроллера, такие как ваши переменные session, params или request, а также не может видеть или контролировать конкретные транзакции базы данных, которые происходят во время тестирования.

Вместо того чтобы полагаться на фикстуры транзакций, рассмотрите возможность использования средства очистки базы данных, которое вручную сбрасывает базу данных после каждого функционального теста. Вы можете найти жемчужину здесь: https://github.com/DatabaseCleaner/database_cleaner. Убедитесь, что вы следуете инструкциям по интеграции с Capybara: https://github.com/DatabaseCleaner/database_cleaner#rspec-with-capybara-example.

person Anthony E    schedule 30.04.2016
comment
Capybara эффективно тестирует ваше приложение как внешний процесс — не совсем так, это зависит от того, какой драйвер вы используете. Стандартный тест стойки выполняется в рамках того же процесса. С Selenium это отдельный процесс. - person Andy Waite; 30.04.2016
comment
Правда, я думаю, что все, кроме RackTest, запускает отдельный поток. В любом случае, сами тесты Capybara выполняются изолированно от контроллера. - person Anthony E; 30.04.2016