Для тех, кто может сделать это в будущем, вот мое решение:
Это класс, который устанавливает новую стратегию для аутентификации через 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 /.../ стратегия.У меня также есть lib, настроенная для автоматической загрузки через конфигурацию rails.
Со стороны 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.Я действительно должен был реализовать то, что, как я думал, будет работать, а затем правильные тесты, чтобы доказать это после факта.Теперь мы можем сделать это, возможно, наоборот.