2011-10-20 20 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中的共享上下文现在存在于上下文中,并且不会流入全局范围,因此您应该使用它们。或者,因为共享示例可能会让人混淆,难以独立运行,所以我会考虑构建自己的匹配器。 –

1

为什么你不想写共享的例子?这正是他们想要的。

+0

写共享示例在这里感觉像是过度杀伤。像这样的情况有很多,共享示例只能应用一次。因此,这些共享示例根本不共享。 –

+0

如果共享示例没有全局保存,那么我会说使用它们,但由于它们不是(至少上次我检查过),我同意它们有点矫枉过正。 –