我的规格有:
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打印出来,这就是我想要的。但是,虽然我在测试中也使用了任何变量,但我无法获得相同的结果。
答案 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