【问题标题】:rspec - how can I refer to a let variable in the it descriptionrspec - 我如何在 it 描述中引用 let 变量
【发布时间】:2014-05-17 21:02:07
【问题描述】:

我的规格有:

describe "can translate" do
  let(:from){591}
  it "#{from}" do
    expect(Translator.three_digits(from)).to eq 'five hundred ninety two'
  end
end 

但是 591 是硬编码和重复的,我想消除它...
那么如何在it 描述中引用from

我试过let(:from){591}

然后使用it "#{@from}" 但这并没有显示出来

我也尝试过使用it "#{from}",但由于它正在寻找一个局部范围的变量,所以会报错undefined local variable or method 'from' for #<Class:0x00000001bc4110> (NameError)

我可以通过常量避免所有这些范围问题,即

describe "can translate" do
  FROM=592
  it "#{FROM}" do
    expect(Translator.three_digits(FROM)).to eq 'five hundred ninety two'
  end
end

当我得到一个错误时,我实际上得到了A ruby file called translator.rb can translate 591(或任何数字,关键是它打印出来的结果与我对变量的所有尝试不同)。 ` 但这似乎是一个糟糕的方法。我更喜欢尽可能避免使用常量,并且我想连续对多个值进行此测试,因此我需要一些可以根据情况更改的内容,而 CONSTANT 似乎不合适。

我之前也尝试过 :all 同时使用局部变量和实例变量,但没有成功。

如果我对它进行硬编码并将 591 作为文本并且测试失败,那么 591 会打印出来,这就是我想要的。但是,尽管我也在测试中使用了任何变量,但我无法获得相同的结果。

【问题讨论】:

    标签: ruby rspec let


    【解决方案1】:

    如果您想对多个值运行相同的测试,您可以这样做:

    values = [100,200,300]
    
    values.each do |value|
      it "#{value} do
        ... # use value here
      end
    end
    

    您无法按照您尝试的方式执行此操作的原因是it 是一个类方法,而lets 定义了一个实例方法。另请注意,如果您多次使用let,您将用新的方法定义覆盖以前的方法定义。由于 rspec 首先读取所有测试定义然后执行它们,它们都将使用 let 定义的相同方法运行。因此这不会按预期工作:

    values = [100,200,300]
    
    values.each do |value|
      let(:from) { value }
      it "#{value} do
        puts from
      end
    

    结束

    上面会输入300 3次。

    【讨论】:

      【解决方案2】:

      您可以在 describe 块中添加 Ruby 代码来定义一个集合,然后可以枚举该集合以生成多个示例,例如:

      describe "can translate" do
        translations = [
          {input: 591, output: "five hundred ninety one"},
          {input: 592, output: "five hundred ninety two"}
        ]
        translations.each do |t|
          context "when input is #{t[:input]}" do
            it "translates to #{t[:output]}" do
              expect(Translator.three_digits(t[:input])).to eq t[:output]
            end
          end
        end
      end
      

      【讨论】:

        【解决方案3】:

        我正在尝试(并成功)这样的局部变量:

        ...
        describe "can translate" do
          from=738
          it from do
            expect(Translator.three_digits from).to eq 'seven hundred thirty eight'
          end 
        end 
        describe "can translate" do
          from=592
          it from do
            expect(Translator.three_digits(from)).to eq 'five hundred ninety two'
          end
        end
        ...
        

        【讨论】:

          【解决方案4】:
          describe "can translate" do
            subject { Translator.three_digits(from) }
            let(:from){|e| e.description.to_i}
            it "592" do
              is_expected.to eq 'five hundred ninety two'
            end
            # or
            specify("593"){ is_expected.to eq 'five hundred ninety three' }
          end 
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-01-19
            • 2020-03-03
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多