2011-05-27 17 views
8

Tüm yönetici denetleyicileri için denetleyici denetimini (projemin Admin ad alanı altındaki tüm denetleyiciler) gerçekleştiren paylaşılan bir örnek grubu oluşturarak özelliklerimi DRY tutmaya çalışıyorum. Bunun nasıl yapılacağını anlamaya çalışıyorum, çünkü paylaşılan örnek hangi eylemlerin ve parametrelerin kullanılacağı hakkında bilgi vermelidir. Bir test başarısız olursa (yani, test ettiği eylemin detaylarını da dahil ederek) ideal olarak anlamlı hatalar sunmalıdır.RSpec 2'de dinamik olarak paylaşılan örnekler oluşturuyor musunuz?

require 'spec_helper' 

shared_examples "an admin controller" do 

    before(:each) do 
    @non_admin = User.make 
    @admin = User.make(:admin) 
    end 

    context "as an admin user" do 
    @actions.each do |action, params| 

     specify "I should be able to access ##{action.last} via #{action.first}" do 
     self.active_user = @admin 
     send(action.first, action.last, params) 

     response.status.should be_ok 
     end 

    end 
    end 

    context "as a regular user" do 
    @actions.each do |action, params| 

     specify "I should be denied access to ##{action.last}" do 
     self.active_user = @non_admin 
     send(action.first, action.last, params) 

     response.status.should be 403 
     end 

    end 
    end 

end 

describe Admin::UserNotesController do 

    @user = User.make 
    @actions = { [:get, :index] => { :user_id => @user.id }, 
       [:get, :new]  => { :user_id => @user.id }, 
       [:post, :create] => { :user_id => @user.id } } 

    it_behaves_like "an admin controller" 

end 

@actions paylaşılan örnek grubuna görünmüyorsa bariz nedenle bu hataları. let kullanırsanız, bu yalnızca describe bloğu bağlamında değil, bir örnek bağlamında kullanılabilir. Herhangi bir fikir?

cevap

27

İşte çalışmalıdır çok daha temiz bir şekilde açıklanmıştır: Bu parlak

require 'spec_helper' 

shared_examples "an admin controller" do |actions| 
    context "as an admin user" do 
    actions.each_pair do |action, verb| 
     specify "I should be able to access ##{action} via #{verb}" do 
     send(verb, action, :user_id => User.make(:admin).id) 
     response.status.should be_ok 
     end 
    end 
    end 

    context "as a regular user" do 
    actions.each_pair do |action, verb| 
     specify "I should be denied access to ##{action}" do 
     send(verb, action, :user_id => User.make.id) 
     response.status.should be 403 
     end 
    end 
    end 
end 

describe Admin::UserNotesController do 
    it_behaves_like "an admin controller", { 
    :index => :get, 
    :new => :get, 
    :create => :post 
    } 
end 

fazla bilgi

+1

için http://relishapp.com/rspec/rspec-core/v/2-6/dir/example-groups/shared-examples bakınız, teşekkür ederim! Kod silme gibi bir şey yok :) – d11wtq