Help us understand the problem. What is going on with this article?

Capybara + FactoryGirlでの、TwitterのOAuth(Omniauth)認証を使ったRailsアプリのテストの書き方サンプル

More than 5 years have passed since last update.

追記 2012/09/22

モック部分、シンボルだとうまくいかないので文字列で"uid"という風に書かないといけません。修正しました。

初めてTDDをやってるのですけど、OAuth認証のテストのやりかたを調べるのに時間がかかったので、後のためにここに書いておきます。

auth_spec.rb
#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で作るフィクスチャは、以下のようにしました。

factories.rb
#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",

と書くとよい。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away