追記 2012/09/22
モック部分、シンボルだとうまくいかないので文字列で"uid"という風に書かないといけません。修正しました。
初めてTDDをやってるのですけど、OAuth認証のテストのやりかたを調べるのに時間がかかったので、後のためにここに書いておきます。
# coding: utf-8
require 'spec_helper'
describe "A logged in user" do
before do
OmniAuth.config.test_mode = true
user = FactoryGirl.create(:user)
OmniAuth.config.mock_auth[:twitter] = {
"uid" => "11111",
"provider" => "twitter",
"info" => {
"description" => "こんにちはこんにちは! かとりょーです!"
}
}
visit "/auth/twitter"
end
after do
OmniAuth.config.test_mode = false
end
describe "in items page" do
it "should add an item by the user" do
visit items_path
click_link "宣伝一覧"
click_link "宣伝を登録する"
fill_in "item_body", :with => "アナテマ・フィジクスをぜひプレイしてみて!"
click_button "登録"
click_link "宣伝一覧"
page.should have_content("アナテマ・フィジクスをぜひプレイしてみて!")
page.should have_content("Edit")
click_link "ユーザー一覧"
page.should have_content("denki")
end
end
end
です。
OmniAuth.config.test_mode = true
と
OmniAuth.config.mock_auth[:twitter] = {:uidなど}
がポイント。
モックをauth_spec.rbのほうで作ってしまって、フィクスチャで作ったユーザーには/auth/twitterにアクセスしてもらうことで、OAuth認証が完了します。OAuthのgemはomniauth-twitterを使ってます。
FactoryGirlで作るフィクスチャは、以下のようにしました。
# coding:utf-8
FactoryGirl.define do
factory :item do
body "アナテマ・フィジクスを見てね!"
user
end
factory :user do
sequence(:name_twitter) { |n| "denki#{n}" }
sequence(:uid_twitter) { |n| n + 1000 }
point 5
end
factory :retweet do
item
user
end
end
参考
https://github.com/intridea/omniauth/wiki/Integration-Testing
OmniauthのGithubのwikiには、モックは
:provider => 'twitter',
という風に書くように指定されているが、実際はこれだとうまくいかなかったりするので、Stackoverflowの
http://stackoverflow.com/questions/9730886/rails-rspec-and-omniauth-integration-testing
で教えられるように、文字列で
"provider" => "twitter",
と書くとよい。