rspec - 如何在it描述中引用let变量

时间:2014-04-05 13:35:30

标签: ruby rspec let

我的规格有:

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

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

我尝试过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似乎不合适的内容。

我之前也尝试过:所有都有本地变量和实例变量但没有成功。

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

4 个答案:

答案 0 :(得分: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三次。

答案 1 :(得分:0)

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

...
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
...

答案 2 :(得分:0)

您可以在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 :(得分:0)

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