【问题标题】:Inherit example in nested Rspec contexts在嵌套的 Rspec 上下文中继承示例
【发布时间】:2011-10-20 00:46:07
【问题描述】:

如何重用这些示例,以便只覆盖嵌套上下文的详细信息?

类似这样的东西(我使用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 个示例。

如何实现(无需编写共享示例)?

【问题讨论】:

    标签: ruby-on-rails ruby testing rspec


    【解决方案1】:

    没有办法继承示例,但你可以创建一个类方法:

    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
    

    您可以根据需要进行重构。

    【讨论】:

    • 注意:我不再推荐这种分享示例的方式。 RSpec 中的共享上下文现在存在于上下文中,并且不会渗入全局范围,因此您应该使用它们。或者,由于共享示例可能会导致独立运行令人困惑且难以调试,因此我会考虑构建您自己的匹配器。
    【解决方案2】:

    您为什么不想编写共享示例?这正是他们的目的。

    【讨论】:

    • 在这里编写共享示例感觉有点矫枉过正。在很多情况下,共享示例只会应用一次。因此,这些共享示例根本不共享。
    • 如果共享示例没有在全球范围内保存,那么我会说使用它们,但由于它们不是(至少在我上次检查时),我同意它们有点矫枉过正。
    猜你喜欢
    • 1970-01-01
    • 2011-06-19
    • 1970-01-01
    • 2014-01-25
    • 1970-01-01
    • 2011-11-24
    • 1970-01-01
    • 2017-08-21
    • 1970-01-01
    相关资源
    最近更新 更多