FacebookのOAuth認証使ったアプリのテストを書く

facebook_oauth+Oauth2の場合

多分koalaでも基本一緒

Facebookへのトークン取得と自分の基本情報をfacebook_oauthから取得するようなプログラムのテストを書く場合

1.トークン取得
2.情報取得

の計2回Facebook APIを叩く必要がある。

まじめにやるならfoge_controller_test.rbに

require 'uri'
require 'net/http'

を追加して、FB側からのコールバック処理に

get :callback, { :code => "自分が使ってるホントのトークン"}

としてやれば動くはず。


ただ、アクセストークンは勿論固定ではないし、これだと自分自身のデータしか使えないのでユーザーごとに処理を変えるというようなことができない。

そこで、APIへのアクセスをダミー化してやる必要がある。

ダミー化するためにfakewebを使う

Gemfile

gem 'fakeweb'

テストコントローラーでfakewebを使う
hoge_controller_test.rb

require 'fakeweb'

先述の通りfacebook APIへの接続はトークン取得と情報取得2回発生するする。

なのでテストファイルには、まず1回目のアクセス用

FakeWeb.register_uri(:any, %r|https://graph\.facebook\.com/oauth|,
{:body => "access_token=12345", :status => ["200","OK"]}
)

https://graph.facebook.com/oauth/access_tokenがアクセストークン取得用URLだが、前方一致で/oauthまででおk

2回目のアクセス(データ取ってくる用)

FakeWeb.register_uri(:any, %r|https://graph\.facebook\.com/me|,
{:body => JSON.generate(:id => 11111111, :name=>'ほげほげ'),
:status => ["200","OK"],
:content_type => "application/json"}
)

https://graph.facebook.com/meがデータ取得用APIなので、トークン取得用と2回に分けて記述する必要がある。

ハマったのはパラメータの方で、facebookAPIは、リクエストに対してjson形式の値をbodyに入れて返すのだが、OAuth2がレスポンスヘッダに応じて処理を変えているため、明示的に:content_typeを指定してあげないといけない。
今回はfacebook_oauthを使ったが、たぶんこのへんはベースにOAuth2を使ってるkoalaでも一緒だと思う。

というか最近はfacebook_oauthは古くてkoalaが全盛だし、しかもさんざん調べてfakeweb使ったのにwebmockのほうがトレンドとかrubyってホント移り変わりが早い。


あとコントローラーに処理バリバリ書いてたのに、普通はモデルに書くもんだとかさ、どっかにそういうの書いておいてよマジで。