2012-02-05 2 views
7

내 api 용 2-Legged OAuth 공급자를 구축 중입니다. 모든 것이 제대로 연결되어 있고 레일 콘솔에서 서명 된 전화를 걸 수 있습니다. 문제는 OAuth를 controller_spec에 통합하는 데 문제가 있다는 것입니다. 내 컨트롤러 테스트에서 뭐하는 거지 여기컨트롤러 사양에 서명 된 OAuth 요청을 사용하도록 알릴 수있는 방법

coneybeare $ rails c test 
Loading test environment (Rails 3.2.0) 
rails test: main 
>> consumer = OAuth::Consumer.new("one_key", "MyString", :site => [REDACTED]) 
# => #<OAuth::Consumer:0x007f9d01252268 @key="one_key", @secret="MyString", @options={:signature_method=>"HMAC-SHA1", :request_token_path=>"/oauth/request_token", :authorize_path=>"/oauth/authorize", :access_token_path=>"/oauth/access_token", :proxy=>nil, :scheme=>:header, :http_method=>:post, :oauth_version=>"1.0", :site=>[REDACTED]}> 

ruby: main 
>> req = consumer.create_signed_request(:get, "/api/v1/client_applications.json", nil) 
# => #<Net::HTTP::Get GET> 

ruby: main 
>> res = Net::HTTP.start([REDACTED]) {|http| http.request(req) } 
# => #<Net::HTTPOK 200 OK readbody=true> 

ruby: main 
>> puts res.body 
{"client_applications":[{"id":119059960,"name":"FooBar1","url":"http://test1.com"},{"id":504489040,"name":"FooBar2","url":"http://test2.com"}]} 
# => nil 

된다 : 여기

내 서버에 작업 호출의 예입니다

require 'oauth/client/action_controller_request' 
describe Api::ClientApplicationsController do 
    include OAuthControllerSpecHelper 
    … 
    … 
    it "assigns all client_applications as @client_applications" do 
     consumer = OAuth::Consumer.new("one_key", "MyString", :site => [REDACTED]) 
     ActionController::TestRequest.use_oauth=true 
     @request.configure_oauth(consumer) 
     @request.apply_oauth! 
     puts "request.env['Authorization'] = #{@request.env['Authorization']}" 
     get :index, {:api_version => 'v1', :format => :json} 
     response.should be_success # Just this for now until I can get authorization, then proper controller testing 
    end 
end 

그 시험의 출력 :

request.env['Authorization'] = OAuth oauth_consumer_key="one_key", oauth_nonce="gzAbvBSWyFtIYKfuokMAdu6VnH39EHeXvebbH2qUtE", oauth_signature="juBkJo5K0WLu9mYqHVC3Ar%2FATUs%3D", oauth_signature_method="HMAC-SHA1", oauth_timestamp="1328474800", oauth_version="1.0" 
1) Api::ClientApplicationsController GET index assigns all client_applications as @client_applications 
    Failure/Error: response.should be_success 
    expected success? to return true, got false 

레일에서 해당 서버 호출 로그 :

Processing by Api::ClientApplicationsController#index as JSON 
    Parameters: {"api_version"=>1} 
    Rendered text template (0.0ms) 
Filter chain halted as #<OAuth::Controllers::ApplicationControllerMethods::Filter:0x007f85a51a8858 @options={:interactive=>false, :strategies=>:two_legged}, @strategies=[:two_legged]> rendered or redirected 
Completed 401 Unauthorized in 15ms (Views: 14.1ms | ActiveRecord: 0.0ms) 
    (0.2ms) ROLLBACK 

왜 작동하지 않는지 알 수 없습니다./나는 명백한 실수를하고 있습니까?

+0

소리 투기. 요청 사양으로 사용해 보셨습니까? – apneadiving

+0

컨트롤러 사양입니다. 이 예제는 그 맨손으로 본질적으로 제거되었습니다. 당신이 정확하다면, 그리고 이런 유형의 테스트가 요청 스펙에 들어 있어야한다. 내가 OAuth에 의해 보호받을 때 내 컨트롤러를 테스트 할 다른 방법은 없을까? – coneybeare

+0

요즘 API를 테스트 중이며 컨트롤러 사양에서 헤더에 적절한 값을 전달하기 만하면됩니다. 미안해, 나는 OAuth를 정말로 모른다. 귀하의 경우 두려움은'create_signed_request'가 예상 결과를 얻지 못한다는 것입니다. 디버깅을 시도 했습니까? 그냥 생각 : 당신은 어떤 before_filters' 테스트를 우회 할 수 있습니다 – apneadiving

답변

0

컨트롤러를 테스트하는 가장 좋은 방법은 가장 간단하다는 것입니다. 컨트롤러가 올바른 정보 (컨트롤러 사양이 아닌 요청 사양에 실제로 포함되어있는 정보)를 얻도록 각 테스트에 서명하는 대신 컨트롤러에 수동으로 필요한 정보를 제공 할 수 있다고 생각했습니다.

이렇게하려면, 간단히 말해서 나는이 방법을 스텁했다 다음 allow? 방법을 스텁

fixtures :client_applications 
before(:each) do 
    @client_application1 = client_applications(:client_application1) 
    Api::ClientApplicationsController::Authenticator.any_instance.stub(:allow?).and_return(true) 
    controller.stub(:client_application).and_return(@client_application1) 
end 

랙 정식이가 인증 한 생각으로 바보짓을하는 원인이되었다. allow?도 자격 증명에 따라 client_application을 설정 했으므로 그 내용도 스텁해야했습니다. 이제 승인이 취소되었으므로 컨트롤러를 올바르게 테스트 할 수 있습니다. 당신이 요구 사양에서 테스트하고자 실제로 스텁없이 테스트 할 필요가 원하는 경우

0

나는 Omniauth 테스트 도우미가 어떻게 작동하는지 특히이 파일들 : https://github.com/intridea/omniauth/tree/master/lib/omniauth/test을 살펴볼 것입니다. 이 설정 방법에 대한 아이디어는 wiki page on integration testing을 참조하십시오. 나는 당신이 클라이언트가 아닌 공급자를 만들고 있다는 것을 알고 있습니다. 그러나 이것이 좋은 출발점이 될 수 있습니다. 또한 일부 의견 제시자가 이미 말했듯이 컨트롤러 테스트를 통해이 작업을 수행 할 수 있는지 여부는 알 수 없습니다. 랙 환경을 완벽하게 시뮬레이트하려면 요청 또는 통합 테스트가 필요할 수 있습니다.

1

, 당신은 OAuth 고객을 구축 할 수 있으며,이 같은 요청에 서명 : 그것은 정말 컨트롤러가 아닌 것처럼

@access_token = FactoryGirl.create :access_token 
    @consumer = OAuth::Consumer.new(@access_token.app.key, @access_token.app.secret, :site => "http://www.example.com/") 
    @path = "/path/to/request" 
    @request = @consumer.create_signed_request(:get, @path, OAuth::AccessToken.new(@consumer, @access_token.token, @access_token.secret)) 
    get @path, nil, { 'HTTP_AUTHORIZATION' => @request.get_fields('authorization').first } 
관련 문제