2011-10-20 2 views
3

중첩 된 컨텍스트에 대한 세부 정보 만 재정의하도록 예제를 다시 사용할 수 있습니까? 이 같은중첩 된 Rspec 컨텍스트에서 예제를 상속합니다.

뭔가 (내가 대신이 중첩 된 컨텍스트에서 실행되고 있음을 나타냅니다 그것의 thee를 사용 그것은 내가 원하는 그냥 뭐, RSpec에 있지 않습니다.) :

describe "Abilities" do 
    subject { Abilities.new user } 

    context "allowed" do 
    let(:user) { Factory(:power_user) } 
    thee { should be_able_to :create, object } 
    thee { should be_able_to :read, object } 
    thee { should be_able_to :update, object } 

    context "comment" do 
     let(:object) { Factory(:comment) } 
    end 

    context "post" do 
     let(:object) { Factory(:post) } 
    end 

    context "blog" do 
     let(:object) { Factory(:blog) } 
    end 

    end 
end 

이 예제는 3 끝낼 것 3 가지 컨텍스트 (주석, 게시물, 블로그)에 대한 예제 (작성, 읽기, 업데이트)가 총 9 개의 예제가됩니다.

공유 예제를 작성하지 않고 어떻게 달성 할 수 있습니까?

답변

5

는 예를 상속 할 수있는 방법이 없습니다하지만 당신은 클래스 메소드 할 수 있습니다 :

describe "Abilities" do 
    subject { Abilities.new user } 

    def self.should_allow_stuff 
    it { should be_able_to :create, object } 
    it { should be_able_to :read, object } 
    it { should be_able_to :update, object } 
    end 

    context "allowed" do 
    let(:user) { Factory(:power_user) } 

    context "comment" do 
     let(:object) { Factory(:comment) } 
     should_allow_stuff 
    end 

    context "post" do 
     let(:object) { Factory(:post) } 
     should_allow_stuff 
    end 

    context "blog" do 
     let(:object) { Factory(:blog) } 
     should_allow_stuff 
    end 

    end 
end 

당신은 당신이 좋아하는 경우에 필요 리팩토링 할 수 있습니다.

+0

참고 : 더 이상 예제를 공유하지 않는 것이 좋습니다. RSpec의 공유 컨텍스트는 이제 컨텍스트 내부에 있으며 전역 범위로 유출되지 않으므로 대신 사용해야합니다. 또는 공유 예제가 독립적으로 실행하고 디버그하기가 혼란 스럽기 때문에 대신 자신의 matchers를 빌드하는 방법을 살펴 보겠습니다. –

1

왜 공유 예제를 작성하지 않으시겠습니까? 이것은 바로 그들이하는 것입니다.

+0

공유 예제를 작성하면 과장된 느낌이납니다. 공유 된 예제가 한 번만 적용되는 많은 상황이 있습니다. 따라서 이러한 공유 예제는 전혀 공유되지 않습니다. –

+0

공유 예제가 전역 적으로 보관되지 않은 경우 사용한다고 말하고 싶지만 이후에 (내가 마지막으로 확인한 경우) 그렇지 않아서 과도한 사용이라고 동의합니다. –

관련 문제