#testing #ruby-on-rails-3.1 #rspec-rails
#тестирование #ruby-on-rails-3.1 #rspec-rails
Вопрос:
У меня есть интеграционный тест RSPEC для приложения Rails 3.1, которому необходимо протестировать API для мобильного клиента, отправив запрос POST с параметрами JSON и заголовком mobile, который должен использовать аутентификацию http_basic, поскольку объект запроса недоступен в интеграционном тесте, я немного застрял
Это код, который у меня есть до сих пор
it "successfully posts scores" do
# request.env["HTTP_ACCEPT"] = "application/json" #This causes an error as request is nly available in controller tests
post "scores", :score => {:mobile_user_id => @mobile_user.id, :points => 50, :time_taken => 7275}.to_json,
:format => :json, :user_agent => 'Mobile', 'HTTP_AUTHORIZATION' => get_basic_auth
end
Запрос post не распознает, что я использую базовую аутентификацию http, но не уверен, что формат для json правильный. Любая помощь приветствуется
get_basic_auth — это вспомогательный метод me4, который выглядит следующим образом
def get_basic_auth
user = 'user'
pw = 'secret'
ActionController::HttpAuthentication::Basic.encode_credentials user, pw
end
Я использую before_filter в своих контроллерах, который проверяет мобильность и http_basic_authentication, который выглядит следующим образом
def authorize
logger.debug("@@@@ Authorizing request #{request.inspect}")
if mobile_device?
authenticate_or_request_with_http_basic do |username, password|
username == Mobile::Application.config.mobile_login_name amp;amp; Mobile::Application.config.mobile_password
end
else
unless current_user
redirect_to login_url, :notice => "Please log in"
end
end
end
Я получаю перенаправление для входа в систему, поэтому очевидно, что мобильный заголовок не принимается, поэтому я понятия не имею, работает ли какой-либо из других заголовков
ОБНОВЛЕНИЕ разобралось
post("scores", {:score => {:mobile_user_id => @mobile_user.id, :points => 50, :time_taken => 7275}}.to_json,
{"HTTP_USER_AGENT" => "Mobile", 'HTTP_AUTHORIZATION' => get_basic_auth, 'HTTP_CONTENT_TYPE' => "application/json"})
Отлично справляется с задачей
Ответ №1:
Я понял, что мне нужно было сделать
post("scores", {:score => {:mobile_user_id => @mobile_user.id, :points => 50, :time_taken => 7275}}.to_json,
{"HTTP_USER_AGENT" => "Mobile", 'HTTP_AUTHORIZATION' => get_basic_auth, 'HTTP_CONTENT_TYPE' => "application/json"}
Очевидно, что «мобильный» пользовательский агент не нужен для тестирования обычных запросов json.
Надеюсь, это кому-то поможет