2012年2月26日日曜日

DEPRECATION WARNINGがうざい件

DEPRECATION WARNING: get is deprecated and will be removed from Rails 3.2.
DEPRECATION WARNING: ref is deprecated and will be removed from Rails 3.2.
DEPRECATION WARNING: new is deprecated and will be removed from Rails 3.2.


上記のメッセージがうざかった。
調べてみるとdeviseのバージョンが古いせいみたい。
'2.0.4' へバージョンアップ!!!



spork使ってる方は、要再起動

rspecでruby on rails3(devise)のcontrollerをいい感じに書いてみた~part1

今日初めてrspecを試してみた。
unit:testよりいい


【環境】
devise'2.0.4'
rails'3.1.3'
rspec-rails'2.8.0'

【テスト概要】

アクションごとに

ログインしている場合
・取得オブジェクトが参照できる
・正しいtemplateをレンダーする

ログインしてない場合
・取得オブジェクトが参照できない
・正しいリダイレクト先へいく

をテストすることを想定。

ポイントは shared_context ,share_examples_for を用いて上記のテストを共通化しているところだ。
shared_context はいくつかのサイトで参照したが、引数を渡しているものは見かけなかったので、その点も参考になれば。

この記述を使えば、index ,newやらアクションごとに重複したbehaviorを記述しなくていい

レビューよろしくお願いします。
質問も受け付けてます。



"rails_ROOT"/spec/controllers/blogs_controller_spec.rb


require 'spec_helper'

describe BlogsController do

  before(:each) do
    @crtl = described_class.to_s.downcase
    @crtl_head = @crtl[0..(@crtl.length-11)]
  end

  describe "#login_user" do
    login_user    
    it { subject.current_user.should be }
  end

  shared_context "GET" do |action,block,objs,template|
    before do
        @len = 2
        @len = @len- 1 if action == :index    
        @obj = @crtl_head[0..@crtl_head.length-@len]
    end

    context "#in logined_user" do
      login_user
      before { get action , block }

      it "#object should be" do
        if objs.nil?
          assigns(@obj.to_sym).should be
        else
          objs.each do |obj|
            assigns(obj).should be
          end
        end
      end

      it { response.should be_success }

      subject { response }
      it { should render_template("layouts/#{@crtl_head}") }
      it "#render template" do
        template = @crtl_head + "/" + action.to_s.delete(":") if template == nil
        should render_template(template)
      end
 
    end
 
    context "#in no_logined_user" do
      before { get action , block }

      it { subject.current_user.should be_nil }

      it "#object should be_nil" do
        if objs.nil?
          assigns(@obj.to_sym).should be_nil
        else
          objs.each do |obj|
            it { assigns(obj).should be_nil }
          end
        end
      end
      it { response.should redirect_to(user_session_path) }    
    end
  end


 # [★]各アクションの記述は以下のような最低限の情報だけ渡せばOK

  describe "#index" do
    include_context "GET",:index
  end

  describe "#new" do
    include_context "GET",:new
  end

  describe "#show" do
    include_context "GET",:show,{:id => 47}
  end

  describe "#edit" do
    include_context "GET",:edit,{:id => 47}
  end

end



ちなみに、
[★]の部分をさらに自動化するため
BlogsController.instance_of_methods(false).each でぐるぐる回そうかと思ったが

:_one_time_conditions_valid_70?,
:_one_time_conditions_valid_72?,
:index,
:show,
:new,
:edit,
:create,
:update,
:destroy,
:_run__566814383__process_action__542294131__callbacks

なんか余計なメソッドまで出てきやのでとりあえずスルー
rails初心者なのでまだこれがなんなのか不明です。



さらに、postメソッドも考慮した形も書きました
rspecでruby on rails3(devise)のcontrollerをいい感じに書いてみた~part2