QA@IT

RspecでControllerのテストをするときに、どう書けばいいのかわからない

5140 PV

現在、Rails3.2で開発しています。

そこでソーシャルログイン機能を実装したのですが、この機能をテストしようとrspecでプログラムを書こうとしたところ、コントローラにどのようにアクセスすればいいかわからず質問させていただきました。

具体的に説明させていただきます。
現在アクセスしたいコントローラのroutesの出力結果は以下の様になっています。

user_omniauth_callback        /users/auth/:action/callback(.:format)   users/omniauth_callbacks#(?-mix:facebook)

あと一応テスト対象のコントローラも書かせていただきます。

class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
  def facebook
    # You need to implement the method below in your model
    @user = User.find_for_facebook_oauth(request.env["omniauth.auth"], current_user)

    if @user.persisted?
      flash[:notice] = I18n.t "devise.omniauth_callbacks.success", :kind => "Facebook"
      sign_in_and_redirect @user, :event => :authentication
    else
      session["devise.facebook_data"] = request.env["omniauth.auth"]
      redirect_to new_user_registration_url
    end
  end
end

そこでrspecでこのコントローラをテストする為に、以下の様なrspecを書きましたが全てエラー("No route matches")になりました。

get :user_omniauth_callback,{:action => :facebook}

get :user_omniauth_callback,:action => :facebook

どのように書けば、このコントローラに対してアクセスすることができるのでしょうか?

回答

rspec-rails を使った Controller の spec は下記のように書きます。
参考: https://github.com/rspec/rspec-rails/blob/master/README.md

describe コントローラのクラス do
  it "..." do
    HTTPメソッド アクション名(, params, session)
  end
end

よって質問にある例だと、下記のようになります。

describe Users::OmniauthCallbacksController do
  it "..." do
    get :facebook
  end
end

omniauth を使っているようなので、下記ページも読んでおいたほうがいいかもしれません。
https://github.com/intridea/omniauth/wiki/Integration-Testing

編集 履歴 (0)
  • お返事遅れてすいません。

    なるほどコントローラ内のメソッド名を書くのですか。
    routes.rbと結びつけるのだとばかり、勘違いしておりました。
    おかげさまでアクセスできました。ありがとうございます。
    -
ウォッチ

この質問への回答やコメントをメールでお知らせします。