Как мне подделать вход в OpenID в истории пользователя RSpec / Cucumber при использовании плагина open_id_authentication
-
23-08-2019 - |
Вопрос
Я пытаюсь написать сценарий Cucumber, который требует, чтобы у меня был зарегистрированный пользователь - обычно это было бы довольно просто, но я использую только аутентификацию OpenID (краткое описание плагина аутентификации).Однако, покопавшись в плагинах open_id_authentication, я не уверен, как я мог бы достичь этого в Cucumber.
Решение
Я нашел способ, если вы разместите это в своем features/support/env.rb:
ActionController::Base.class_eval do
private
def begin_open_id_authentication(identity_url, options = {})
yield OpenIdAuthentication::Result.new(:successful), identity_url, nil
end
end
Затем вы можете просто сделать что-то подобное на вашем соответствующем шаге:
Given /^I am logged in as "(.*)"$/ do |name|
user = User.find_by_name(user)
post '/session', :openid_url => user.identity_url
# Some assertions just to make sure our hack in env.rb is still working
response.should redirect_to('/')
flash[:notice].should eql('Logged in successfully')
end
Я просто полностью отключаю авторизацию open id для функций cucumber, очевидно, что если мне нужны экземпляры, в которых произошел сбой входа, я мог бы сделать это на основе предоставленного identity_url.
Другие советы
Если вы хотите иметь возможность заглушать ответы, сделайте это:
В разделе функции / поддержка/helpers.rb:
ActionController::Base.class_eval do
private
def fake_openid_response(identity_url)
[OpenIdAuthentication::Result.new(:successful), identity_url, nil]
end
def begin_open_id_authentication(identity_url, options = {})
yield fake_openid_response(identity_url)
end
end
Переместив ответ в отдельный метод, теперь вы можете при необходимости заглушить ответ в своих шагах.Например, если бы я хотел получить ответ :отсутствует и у меня был контроллер GoogleLoginController, я мог бы сделать следующее, используя Mocha:
GoogleLoginController.any_instance.stubs(:fake_openid_response)
.returns([OpenIdAuthentication::Result.new(:missing), identity_url, nil])
Bort, скелетное приложение rails, имеет полный набор тестов rspec и поддерживает вход в OpenID, так что вы можете захотеть взглянуть, что они делают.
Ответ DEfusion работает, за исключением того, что мне нужно было нормализовать identity_url следующим образом:
ActionController::Base.class_eval do
private
def begin_open_id_authentication(identity_url, options = {})
yield OpenIdAuthentication::Result.new(:successful), self.normalize_identifier(identity_url), nil
end
end
Спасибо