2014-04-05 4 views
0

我有有規格:rspec的 - 我怎麼能是指一個讓變量在它描述

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 

有了,當我得到一個eror我真正得到A ruby file called translator.rb can translate 591(或任何數字,這是它打印出來不像我都嘗試的關鍵與變量)。 ` 但這似乎是一個糟糕的做法。我寧願儘可能地避免常量,我想連續對多個值進行測試,所以我需要一些我可以根據情況而改變的東西,而CONSTANT似乎不合適。

我也嘗試過之前:所有與本地和實例變量,但沒有成功。

如果我對它進行了硬編碼,並且將591作爲文本並且測試失敗,那麼591會打印出我想要的內容。但是,我無法得到相同的結果,雖然我也在測試中使用了任何變量。

回答

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個三次。

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 
... 
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 
相關問題