config.cache_classes = false портит тесты rspec? - PullRequest
4 голосов
/ 11 марта 2011

Я следую учебному пособию по Ruby on Rails Майкла Хартла (railstutorial.org).

В какой-то момент я устал от неудачных тестов, потому что в тестах использовались старые кэшированные версии классов, поэтому я отключил config.cache_classes в тестовой среде.Это решило проблему, и некоторое время все шло хорошо.

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

it "should make a new user" do
    lambda do
      visit signup_path
      fill_in "Name",         :with => "Example User"
      fill_in "Email",        :with => "user@example.com"
      fill_in "Password",     :with => "foobar"
      fill_in "Confirmation", :with => "foobar"
      click_button
      response.should have_selector("div.flash.success",
                                    :content => "Welcome")
      response.should render_template('users/show')
    end.should change(User, :count).by(1)
  end

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

describe "when signed in" do

before(:each) do
  @user = Factory(:user)
  visit signin_path
  fill_in :email,    :with => @user.email
  fill_in :password, :with => @user.password
  click_button
end

it "should have a signout link" do
  visit root_path
  response.should have_selector("a", :href => signout_path,
                                     :content => "Sign out")
end

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

Мне потребовались часы и дни поиска в Интернете и тестирования различных вещей, и, наконец, я нашел решение: снова включить config.cache_classes.Теперь это работает безупречно.

Так может кто-нибудь объяснить мне, почему config.cache_classes делает тесты неудачными?И как я могу отключить кэширование, не испортив мои тесты?

Заранее спасибо,

С уважением, Тобиас

Ответы [ 2 ]

2 голосов
/ 01 ноября 2011

Когда вы делаете вызов Capybara, он использует реечный тест для эмуляции вызова в приложение rails.Каждый раз, когда вызов завершается, он перезагружает все классы рельсов.Это означает, что объект @user, который вы создали до того, как вы вызвали 'visit signin_path', получает nil'd out, потому что все объекты ActiveRecord были перезагружены.

Когда вы устанавливаете кеш-классы в true, он сообщает Rack notчтобы перезагружать объекты ActiveRecord при каждом запросе, чтобы ваши тесты снова проходили.

Я считаю, что если вы хотите, чтобы тест, который вы написали выше, прошел без включения кеш-классов, вы должны переместить '@user = Factory(: user) 'под строкой' visit signin_path '.

1 голос
/ 09 апреля 2011

У меня была точно такая же проблема, и, как и вы, установив config.cache_classes в true, я решил проблему Но я не думаю, что кэширование классов в тестовой среде действительно не то, что вы хотите. Я, конечно, не понимаю, почему кеширование классов делает тесты успешными.

Таким образом, я нашел способ решить эту проблему - установить очистку базы данных, поскольку причина, по которой тесты не выполняются, связана с дублированием записей в тестовой базе данных. https://github.com/bmabey/database_cleaner

Затем в вашем гемфайле, в вашей тестовой группе добавьте это.

gem 'database_cleaner', '0.6.6'

затем запустите "bundle install", чтобы установить этот гем

Затем ... в вашем файле spec_helper.rb добавьте это ..

RSpec.configure do |config|
.
.
.
.
   config.before(:each) do
      DatabaseCleaner.strategy = :truncation
      DatabaseCleaner.clean
   end

Это очистит вашу тестовую базу данных перед каждым запуском ваших тестов rspec.

Надеюсь, это поможет. Ура, знак.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...