2011-12-13 4 views
0

누군가가 나에게 무엇이 잘못되었는지 설명 할 수 있습니까? RSpec을 배우십시오 - 메시지와 함께 실패한 테스트를 받고 있습니다 - 예상 : "Miller"가 : nil. 두 번째 'before 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. 더 나은 방법? 이것은 테스트를위한 조언 일뿐만 아니라 일반적으로 프로그래밍을위한 것입니다. 변수를 업데이트하고 다시 사용하면 상태에 문제가 발생할 수 있습니다. 보다 기능적인 접근 방식을 택하십시오. 이 특별한 경우에는 @valid_attributes을 업데이트하지 않고도 객체를 쉽게 만들 수 있도록 factory_girl 또는 비슷한 보석을 사용해야합니다.

+0

동의. 당신은 RSpec을 처음 접하는 것이 아니라, Ruby에 대해서도 새로운 것 같습니다. 어떤 방법으로 개체를 변이시키고 어떤 변이를 일으키지 않는지를 알아야합니다. 위에서 언급 한 tokland에서 #merge는 mutate하지 않고 #update는 변경됩니다. – TreyE

+0

사실, 나는 Ruby도 배우고있다. 조언 감사합니다. – basheps