2012-04-26 23 views
1

測試我的集成測試是這樣的:Rails的整合與法拉第Omniauth

class OAuthTest < ActionDispatch::IntegrationTest 
    ... 

    @client = OAuth2::Client.new(            
    client_id,            
    client_secret,           
    { :site => 'https://provider', :token_url => '/oauth/access_token' } 
)                    

    @client.connection.build do |b|            
    b.adapter :action_dispatch, self 
    end                   

    access_token = @client.auth_code.get_token(...) 
    access_token.get("/user.json") 

並與法拉第0.7.6它工作得很好,在action_dispatch適配器將路由HTTP請求到我的Rails應用程序(調用users_controller)。但法拉第0.8.0的action_dispatch適配器被替換爲rack(見https://github.com/technoweenie/faraday/pull/134),我無法使它工作。

我想我需要將上面的代碼改成這樣:

@client.connection.build do |b|  
    b.adapter :rack, self.app   
end         

但它在機架(1.2.5)期待一個流失敗,但它得到一個Hash和線149說undefined read method for Hash(這裏:https://github.com/rack/rack/blob/1.2.5/lib/rack/request.rb#L149)。

我該如何做這項工作?

回答

5

您將需要添加中間件url_encoded以使其工作;

@oauth = OAuth2::Client.new('client_id', 'client_secret') do |b| 
    b.request :url_encoded 
    b.adapter :rack, Rails.application 
end 
+1

哇,這個工程!非常感謝你!!! – 2012-07-24 08:53:24

1

從測試套件中,您可以直接通過app變量訪問機架應用程序。該代碼應該是:

@client.connection.build do |b|  
    b.adapter :rack, app 
end 

我想這一點上a sample app和它的工作對我來說。祝你好運!

+0

感謝您的回答。儘管它對我沒有多大幫助......我的'self.app'和'app'一樣。我看到的問題是在我的情況下'@env [「rack.input」]'是一個哈希。順便說一下:我使用的是Rails 3.0.10,我使用的是Omniauth(這可能與它有關,你知道,omniauth在幕後做了很多巨大的事情)。看到它在這裏初始化:https://github.com/intridea/oauth2/blob/master/lib/oauth2/client.rb#L48 – 2012-04-26 19:03:07