Это потому, что модуль python re
довольно слаб и не поддерживает подпрограммы и рекурсию Вместо этого попробуйте модуль pypi regex
. Это скомпилирует ваше регулярное выражение.
Я выяснил путь, если Вы помещаете это в свой 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
Я просто полностью ударяю открытого идентификационного автора для огуречных функций, очевидно, если мне нужны экземпляры, где там является отказавшим, входят в систему, я мог сделать это на основе предоставленного identity_url.
Борт, скелетное приложение направляющих, имеет полный набор тестов rspec и поддерживает открытый вход в систему, таким образом, можно хотеть смотреть и видеть то, что они делают.
Ответ 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
Спасибо
Если вы хотите иметь возможность заглушать ответы, сделайте следующее:
В features/support/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
Вынеся ответ в отдельный метод, вы теперь можете заглушить его в своих шагах, если это необходимо. Например, если мне нужен ответ :missing и у меня есть контроллер GoogleLoginController, я могу сделать следующее, используя Mocha:
GoogleLoginController.any_instance.stubs(:fake_openid_response)
.returns([OpenIdAuthentication::Result.new(:missing), identity_url, nil])