автотест и rspec дают разные ответы - PullRequest
2 голосов
/ 12 июля 2011

У меня есть приложение, которое я тестирую с помощью rspec2 (2.6.4), капибары и селена.

Когда я запускаю любую спецификацию запроса напрямую с помощью rspec, тест проходит.

Когда я запускаю спецификации запроса с помощью автотеста, все они терпят неудачу с сообщением: «Не удается найти пользователя с ID = **.

Когда автотест автоматически перезагружает первый тестовый запрос, он проходит

Автотест, а затем перезагружает все тесты, и когда он достигает тестовых запросов, все они снова проходят неудачнофабрикант и вошел в систему с помощью устройства devise следующим образом:

before(:each) do
  @user = Factory(:user)   
  login_as @user
end 

after(:each){
    logout
  }

и в помощнике спецификаций у меня есть

def login(user)
  post login_path, :login => user.login, :password => 'testing'
end

Это соответствующие гемы, которые я установил (группа: тест)

  gem "rspec"
  gem "rspec-rails"
  gem  "autotest-rails"
  gem "selenium-webdriver", ">= 0.2.2"
  gem 'capybara', :git => 'git://github.com/jnicklas/capybara.git'
  gem 'launchy'
  gem 'database_cleaner'

Это меня некоторое время сбивало с толку - есть мысли кого-нибудь?Даже какие-нибудь мысли о том, как начать смотреть на трассировку стека, чтобы увидеть, где эти два вызова различаются?

1 Ответ

2 голосов
/ 13 июля 2011

Решено, вроде.Что на самом деле здесь происходит, остается загадкой, но вот точное описание того, что на самом деле является проблемой, и как я ее решил.Автотест не виноват - проблема заключается в запуске всех тестов в одной партии.Запуск rspec spec/**/* вызывает ту же ошибку.Это подсказка о том, что проблема связана с невозможностью правильно очистить базу данных между тестами.Я использую devise и поэтому в конечном итоге полагаюсь на warden для аутентификации на основе стойки.Следуя документации Warden, я вызвал Warden.test_reset!в блоке after (: suite).Если переместить это в блок after (: all), тесты пройдут одинаково, независимо от того, будут ли они выполняться по отдельности, как тесты запроса или все тесты в одном блоке.

Так что же мы узнали?Я думаю, что проблема (по крайней мере, для меня) была в конечном итоге вызвана запутанным наименованием хуков rspec.Я думаю, что «набор» номеров в отеле меньше, чем «все» номера в отеле.Но, очевидно, «набор» примеров rspec - это больше, чем «все» примеры.На самом деле набор примеров rspec - это просто «все примеры в каталоге spec».Очистка надзирателя после того, как все они пройдены, не имеет никакого эффекта.Мы должны очищать их после каждой спецификации - и для этого нужно запустить test_reset!в блоке after (: all).

Надеюсь, это кому-нибудь поможет ...

...