Вопрос

После клонирования последних стабильных версий

в чистое приложение rails и следуя (как я полагаю) всем инструкциям для каждого плагина, cucumber stories по-прежнему терпят неудачу :-(.Вот краткое изложение проблем:

  1. перенаправления не работают сразу, несмотря на то, что был создан маршрут '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''
    
  2. в истории говорится, что 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 нарушен в его текущей версии?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top