2011-12-13 89 views
0

有人可以向我解釋這裏有什麼問題。學習RSpec - 我收到了一封失敗的測試結果 - 希望:「Miller」得到:無。我認爲第二個'block'之前只是將middle_name與原始的@valid_attributes合併。什麼是這樣做的正確方法。我知道我可以簡單地說p.middle_name來分配它,但我正在嘗試學習RSpec的概念。RSpec屬性散列

describe Person do 
    describe "Validations" do 
    subject { p } 
    before { @valid_attributes={first_name: "Joe", last_name: "Sample"} } 

    ... 

    context "with optional middle name" do 
     let(:p) { Person.new(@valid_attributes) } 
     before { @valid_attributes.merge({middle_name: "Miller"}) } 

     its(:middle_name) { should eq("Miller") } 
    end 
    end 
end 

回答

3
  1. 您的問題:Hash#merge返回一個新的哈希值,想要Hash#update

  2. 如何做得更好?這不僅僅是一個測試的建議,而是一般的編程:如果你更新和重用變量,你會遇到一些狀態問題;採取更多功能性的方法。在這種特殊情況下,您應該使用factory_girl或類似的gem輕鬆創建對象,而不必更新誰在哪裏知道@valid_attributes

+0

同意。看起來你不僅僅是RSpec的新手,而且還是Ruby。你需要意識到哪些方法會改變對象,哪些不改變。正如托克蘭指出的那樣,#merge不會變異,而#update會變。 – TreyE

+0

的確如此,我也在學習Ruby。謝謝你的建議。 – basheps