Как заставить stories работать с restful_authentication и cucumber?
-
22-08-2019 - |
Вопрос
После клонирования последних стабильных версий
- рельсы (2.3.2),
- рспек (1.2.2),
- огурец (0.2.0.4... вышло 2009-03-24),
- rspec-рельсы (1.2.2),
- restful-аутентификация (исправлен formatted_user_path и несколько других проблем),
- вебрат,
- рубист-aasm (и несколько других)
в чистое приложение rails и следуя (как я полагаю) всем инструкциям для каждого плагина, cucumber stories по-прежнему терпят неудачу :-(.Вот краткое изложение проблем:
- перенаправления не работают сразу, несмотря на то, что был создан маршрут 'map.root : controller => "my_controller"' :
expected redirect to "/", got no redirect (Spec::Expectations::ExpectationNotMetError) /cygdrive/c/development/test/vendor/plugins/rspec/lib/spec/expectations.rb:57:in `fail_with' /cygdrive/c/development/test/vendor/plugins/rspec/lib/spec/expectations/handler.rb:14:in `handle_matcher' /cygdrive/c/development/test/vendor/plugins/rspec/lib/spec/expectations/extensions/object.rb:31:in `should'. /features/step_definitions/user_steps.rb:111:in `/^an? (.*) user named '(.*)'$/' features/sessions.feature:25:in `And an activated user named 'reggie''
- в истории говорится, что
logged_in?
метод защищен, несмотря наfeatures/step_definitions/ra_env.rb
вызов файла:ApplicationController.send(:public, :logged\_in?, :current\_user, :authorized?)
Разве этот вызов не делает эти методы доступными без необходимости заглушки?
О, и я пытаюсь запустить autospec, поэтому я выполнил следующие команды, чтобы запустить его:
export AUTOFEATURE=true rake spec:server:start ruby script/autospec
Решение
Я провел кое-какие исследования, и вот что я получил.В ra_response_steps.rb
ожидайте, что перенаправление будет грубым, а затем история, чтобы определить, следует ли следовать перенаправлению или нет.Это не удается, потому что реализация сеанса Webrat имеет следующий код:
def request_page(url, http_method, data) #:nodoc: h = headers h['HTTP_REFERER'] = @current_url if @current_url debug_log "REQUESTING PAGE: #{http_method.to_s.upcase} #{url} with #{data.inspect} and HTTP headers #{h.inspect}" if h.empty? send "#{http_method}", url, data || {} else send "#{http_method}", url, data || {}, h end save_and_open_page if exception_caught? && Webrat.configuration.open_error_files? raise PageLoadError.new("Page load was not successful (Code: #{response_code.inspect}):\n#{formatted_error}") unless success_code? reset @current_url = url @http_method = http_method @data = data if internal_redirect? check_for_infinite_redirects request_page(response_location, :get, {}) end return response end
Обратите внимание на if internal_redirect? ... end
.Это if приводит к сбою наших тестов из-за того, что webrat выполняет перенаправления.В качестве обходного пути вы можете прокомментировать эти строки в своем сеансе webrat, но это, вероятно, не является достойным решением.Я еще немного поработаю и где-нибудь опубликую патч.
Другие советы
Я нашел это сообщение в блоге, которое хорошо объясняет суть проблемы:
http://blog.andrew.premdas.org/articles/2008/10/15/webrat-visits-and-redirects
по сути, тесты аутентификации restful пытаются протестировать то, что не следует тестировать с помощью webrat.Итак, рекомендованное выше изменение противоположно тому, что, по моему мнению, вероятно, следует изменить.
Я изменил тесты аутентификации Restful, чтобы они не тестировали перенаправления, а просто проверяли, на какой странице вы в конечном итоге оказываетесь.Однако, похоже, все еще существует проблема с некоторыми перенаправлениями, которую я не понимаю:
Then she should be at the new session page # features/step_definitions/ra_response_steps.rb:15
expected "session/new", got redirected to "http://www.example.com/session/new" (Spec::Expectations::ExpectationNotMetError)
Я не понимаю, откуда это берется example.com .у кого-нибудь еще есть подобная ошибка?
Мне пришлось изменить определение функции выхода из системы в user_steps.rb на:
выход из системы def
получить '/ выход из системы'
конец
До этого он пытался получить '/ session / destroy', который существует только в том случае, если вы не удаляете маршруты по умолчанию.
Кроме того, убедитесь, что вы "включили AuthenticatedSystem" в application_controller .
Тем не менее, я все еще борюсь с некоторыми другими проблемами...
Что касается проблемы с "Защищенным методом", я выяснил, что если я не использую autospec и оставляю config.cache_classes=true, то тесты проходят.
Переключение config.cache_classes=false снова приводит к ошибке.
Похоже, что проблема заключается либо в том, как реализовано кэширование классов в rails, либо в том, как rspec управляет созданными классами.К сожалению, у меня нет ресурсов, чтобы подробнее изучить этот журнал целиком, и, похоже, есть хорошая дискуссия по этому поводу, проходящая на:http://groups.google.com/group/rspec/browse_thread/thread/500ede090bd08996/25a3d9a7d283696b?lnk=gst&q=cache_classes#25a3d9a7d283696b
У меня не так много рекомендаций, чтобы предложить, просто сочувствие - недавно я потратил несколько часов на решение той же проблемы.С другой стороны, именно так я выучил RSpec.
Одна вещь, которую я обнаружил, это то, что многие сбои были связаны с тем, что я все равно хотел изменить - например, я хотел перенаправлять не на '/' при входе в систему, а куда-нибудь еще.
В конце концов, большинство сбоев было легко исправить, как только я понял, где искать.
Я работаю над теми же проблемами.Я еще не там, но я думаю, что ApplicationController.send(:public, :logged_in?, :current_user, :авторизованный?) вместо этого нужно зайти в службу поддержки /env.rb.
Я тоже получаю некоторые из упомянутых ошибок.Но первая проблема, возникающая в моем приложении, заключается в следующем:
Определения нескольких шагов имеют одно и то же регулярное выражение:
особенности/step_definitions/user_steps.rb:16:в /^(.*) (.*) user named '(.*)'$/'
features/step_definitions/user_steps.rb:29:in
/^нет (.*) пользователя с именем '(.*)'$/'
(Огурец::Избыточно)
Конечно, я могу это исправить, но последует еще много ошибок (включая защищенный logged_in?метод на контроллере, неисправные RSpecs и так далее).
Кто-нибудь знает, все ли мы делаем здесь что-то в корне неправильное?Или дело просто в том, что restful_authentication нарушен в его текущей версии?