тестирование индивидуальной разработки и / или стратегии надзирателя с помощью rspec

Я вижу множество способов, которые приводят к пользовательским стратегиям авторизации для разработчиков и надзирателей, но что мне особенно нужно, так это тестирование этих решений с помощью rspec. Аналогично этому вопросу: Фильтрация пользователей, которые могут подписывать с Девайсом

Что я могу сделать, чтобы проверить такую ​​реализацию. Rails 3.1.1, Devise (самая последняя версия) и т. д.


person Jeff Ancel    schedule 09.11.2011    source источник


Ответы (1)


Для тех, кто может сделать это в будущем, вот мое решение:

Это класс, который устанавливает новую стратегию аутентификации через Devise (и его также можно использовать с Warden с небольшими изменениями).

require 'devise/strategies/authenticatable'

module Devise
  module Strategies
    class AndroidAuthenticatable < Authenticatable
      def valid? 
        # return true/false
                return valid_params? && valid_headers?
      end 

      def authenticate! 
        failure_message = "Authentication failed for device/user"

        klass = mapping.to # if we're going to come here, we can mock this
        begin
          # code to determine whether or not to authenticate this request
          # if yes, success!(instance of klass)
          # if no, fail!(messsage)
        rescue
          fail!(failure_message) # always fail if not success
        end
      end 

      protected
      def valid_params?
        # params that show whether request should be here
      end

      def valid_headers?
        # headers that determine if request should be here
      end
    end
  end
end

Предыдущий класс находится в моем каталоге lib/.../strategies. У меня также есть библиотека, настроенная для автоматической загрузки через конфигурацию рельсов.

Со стороны rspec, после того, как я создал вышеуказанный класс, я пишу несколько заглушек/моков. Вот базовый файл rspec, с которого можно начать.

# I do this in before block or right before test executes
@request = mock(:request)
@strategy = Devise::Strategies::AndroidAuthenticatable.new(nil)
@request.should_receive(:headers).and_return({#hash of the headers you are testing})
@strategy.should_receive(:params).at_least(:once).and_return({#hash of the params})
@strategy.should_receive(:request).and_return(@request)

# Break these up as needed to test failing and successful 
# strategies for your application
lambda {
   @strategy.should be_valid
   @strategy.authenticate!.should eql :success 
}.should_not raise_error

Это не все включено, но я чувствую, что это должно дать нам хороший старт при добавлении стратегий с Warden или Devise. На самом деле мне пришлось реализовать то, что, как я думал, сработает, а затем нужные тесты, чтобы доказать это постфактум. Теперь мы можем сделать это наоборот, возможно.

person Jeff Ancel    schedule 12.11.2011