2011-03-31 4 views
2

컨트롤러에 PUT 요청을 테스트하려고하는데 GET 및 POST 본문 매개 변수를 조치에 보내야합니다. 코드의 특정 부분이 명시 적으로 GET 매개 변수에 액세스하므로 매개 변수를 함께 매시 할 수 없습니다.Rspec이 PUT 조치에 GET 매개 변수를 전달합니다.

어떻게 GET 매개 변수를 입력 작업에 전달합니까?

it "updates the account password to the provided value" do 
    put(:update, @params) 
    @account.reload.crypted_password.should == PasswordAccount.encrypt(@newpass, @account.password_salt) 
end  

가 어떻게 작용에 보낸 쿼리 문자열에 "토큰"PARAM를 추가 할 수 있습니다

나는이 검사를?

답변

1

UPDATE 데이비드 :

def process_with_query(action, query_string="", parameters = nil, session = nil, flash = nil, http_method = 'GET') 
    # Sanity check for required instance variables so we can give an 
    # understandable error message. 
    %w(@routes @controller @request @response).each do |iv_name| 
    if !(instance_variable_names.include?(iv_name) || instance_variable_names.include?(iv_name.to_sym)) || instance_variable_get(iv_name).nil? 
     raise "#{iv_name} is nil: make sure you set it in your test's setup method." 
    end 
    end 

    @request.recycle! 
    @response.recycle! 
    @controller.response_body = nil 
    @controller.formats = nil 
    @controller.params = nil 

    @html_document = nil 
    @request.env['REQUEST_METHOD'] = http_method 

    parameters ||= {} 
    @request.assign_parameters(@routes, @controller.class.name.underscore.sub(/_controller$/, ''), action.to_s, parameters) 

    @request.session = ActionController::TestSession.new(session) unless session.nil? 
    @request.session["flash"] = @request.flash.update(flash || {}) 
    @request.session["flash"].sweep 

    @controller.request = @request 
    @controller.params.merge!(parameters) 
    build_request_uri(action, parameters) 
    @request.env["QUERY_STRING"] = query_string.kind_of?(Hash) ? query_string.to_param : query_string 
    @request.env["action_dispatch.request.query_parameters"] = Rack::Utils.parse_query(@request.env["QUERY_STRING"]) 
    ActionController::Base.class_eval { include ActionController::Testing } 
    @controller.process_with_new_base_test(@request, @response) 
    @request.session.delete('flash') if @request.session['flash'].blank? 
    @response 
end 

def put_with_query(action, query_string="", parameters=nil, session=nil, flash=nil) 
    process_with_query(action, query_string, parameters, session, flash, 'PUT') 
end 

def post_with_query(action, query_string="", parameters=nil, session=nil, flash=nil) 
    process_with_query(action, query_string, parameters, session, flash, 'POST') 
end 

대한 의견 :

레일 테스트 소스 코드를 조사 후 나는 다음과 함께했다?

3

put 방법은 레일 'ActionController::TestCase::Behavior에 정의되어

http://api.rubyonrails.org/classes/ActionController/TestCase/Behavior.html#method-i-put 내가 다른 GET/포스트 PARAMS 분리에 대한 지원이없는 볼 수 있지만 왜 그냥 @params에 포함 할 수없는 것은에서

변하기 쉬운?

put(:update, @params.merge(:token => 'gobbledygook')) 

코드에 params가 표시 될 때까지 Rails는 사용자를 위해 get/post 매개 변수를 이미 병합했습니다.

HTH,

+0

컨트롤러 쪽에서 별도로 보관하고 싶습니다. 요청에 직접 액세스하고 있습니다. 일부 랙 미들웨어를 가져 와서 요청하십시오. –

관련 문제