【问题标题】:Scope constants to an rspec context范围常量到 rspec 上下文
【发布时间】:2011-03-08 08:31:30
【问题描述】:

我经常想做

context "empty stack" do
  SOME_CONSTANT = "value"
  it "should be empty" do
    # use SOME_CONSTANT
  end
end

context "populated stack" do
  SOME_CONSTANT = "a different value"
  it "should have some items" do
    # use SOME_CONSTANT
  end
end

ruby 不会将常量限定为闭包,因此它们会泄漏。有没有人有一个技巧来声明一个上下文范围内的常量?

【问题讨论】:

    标签: rspec constants rspec2


    【解决方案1】:

    更改常量的声明:
    来自SOME_CONSTANT = "value"
    self::SOME_CONSTANT = "value"

    RSpec 为它遇到的每组规范(在您的示例中为上下文)创建一个匿名类。在匿名类中声明一个没有self:: 的常量使其在全局范围内可用,并且对所有规范都是可见的。将常量声明更改为 self:: 可确保它仅在匿名类中可见。

    【讨论】:

    • 要在 it 块中使用这些常量:self.class::SOME_CONSTANT
    【解决方案2】:

    现在使用 rspec 的时间更长了,我认为更惯用的方法是使用 let。

    context "empty stack" do
      let(:some_constant){ "value" }
    
      it "should be empty" do
        puts some_constant
      end
    end
    
    context "populated stack" do
      let(:some_constant){ "a different value" }
    
      it "should have some items" do
        puts some_constant
      end
    end
    

    【讨论】:

    • 我完全推荐使用let 结构。在此处阅读有关let 的更多信息:relishapp.com/rspec/rspec-core/docs/helper-methods/let-and-let
    • 我想使用let,但它在之前的块中不可用。
    • 这不是真的。带有let 的定义在beforebefore(:each)before(:suite) 中可用。它们只不适用于before(:all)
    • before(:all) 正是我在这里的原因:)
    【解决方案3】:

    正确的做法是使用stub_const

    RSpec.describe "stubbing FOO" do
      it "can stub undefined constant FOO" do
        stub_const("FOO", 5)
        expect(FOO).to eq(5)
      end
    
      it "undefines the constant when the example completes" do
        expect { FOO }.to raise_error(NameError)
      end
    end
    

    https://relishapp.com/rspec/rspec-mocks/v/3-9/docs/mutating-constants/stub-undefined-constant

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-13
      • 2010-11-14
      • 2013-09-18
      • 2021-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多