Как мне подделать вход в OpenID в истории пользователя RSpec / Cucumber при использовании плагина open_id_authentication

StackOverflow https://stackoverflow.com/questions/382473

Вопрос

Я пытаюсь написать сценарий 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

Спасибо

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