FacebookのOAuth認証使ったアプリのテストを書く
facebook_oauth+Oauth2の場合
多分koalaでも基本一緒
Facebookへのトークン取得と自分の基本情報をfacebook_oauthから取得するようなプログラムのテストを書く場合
の計2回Facebook APIを叩く必要がある。1.トークン取得
2.情報取得
まじめにやるならfoge_controller_test.rbに
を追加して、FB側からのコールバック処理にrequire 'uri'
require 'net/http'
としてやれば動くはず。get :callback, { :code => "自分が使ってるホントのトークン"}
ただ、アクセストークンは勿論固定ではないし、これだと自分自身のデータしか使えないのでユーザーごとに処理を変えるというようなことができない。
そこで、APIへのアクセスをダミー化してやる必要がある。
ダミー化するためにfakewebを使う
Gemfile
gem 'fakeweb'
テストコントローラーでfakewebを使う
hoge_controller_test.rb
require 'fakeweb'
先述の通りfacebook APIへの接続はトークン取得と情報取得2回発生するする。
なのでテストファイルには、まず1回目のアクセス用
https://graph.facebook.com/oauth/access_tokenがアクセストークン取得用URLだが、前方一致で/oauthまででおkFakeWeb.register_uri(:any, %r|https://graph\.facebook\.com/oauth|,
{:body => "access_token=12345", :status => ["200","OK"]}
)
2回目のアクセス(データ取ってくる用)
https://graph.facebook.com/meがデータ取得用APIなので、トークン取得用と2回に分けて記述する必要がある。FakeWeb.register_uri(:any, %r|https://graph\.facebook\.com/me|,
{:body => JSON.generate(:id => 11111111, :name=>'ほげほげ'),
:status => ["200","OK"],
:content_type => "application/json"}
)
ハマったのはパラメータの方で、facebookのAPIは、リクエストに対してjson形式の値をbodyに入れて返すのだが、OAuth2がレスポンスヘッダに応じて処理を変えているため、明示的に:content_typeを指定してあげないといけない。
今回はfacebook_oauthを使ったが、たぶんこのへんはベースにOAuth2を使ってるkoalaでも一緒だと思う。
というか最近はfacebook_oauthは古くてkoalaが全盛だし、しかもさんざん調べてfakeweb使ったのにwebmockのほうがトレンドとかrubyってホント移り変わりが早い。
あとコントローラーに処理バリバリ書いてたのに、普通はモデルに書くもんだとかさ、どっかにそういうの書いておいてよマジで。