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
0 件のコメント:
コメントを投稿