2012-03-29 3 views
1

디버깅을 시도하고 있는데 값이 사용자 속성에 제대로 설정되어 있지 않은 것으로 나타났습니다. 디버그 콘솔에서 p user.height_feet 또는 p user.height_inches을 실행할 때, 대신 nil을 얻습니다. 대신에 첫 번째 반복에서 각각 18을 반환 할 것으로 예상됩니다. p invalid_height.firstp invalid_height.second 그러나 18을 올바르게 반환하십시오.RSpec - 사용자 속성에 올바르게 설정되지 않은 값

describe "when height is invalid" do 
    invalid_height = [[1, 8], [8, 2], [5, 13], ['text', 'text'], ['text', 11], [5, 'text'], ['', '']] 
    invalid_height.each do |invalid_height| 
    before do 
     user.height_feet = invalid_height.first 
     user.height_inches = invalid_height.second 
    end 

    it "should not be valid" do 
     debugger 
     user.should_not be_valid 
    end 
    end 
end 

그리고 디버그 단자에서 출력 : 여기에

는 코드 IRC 채널이이 범위의 문제가 될 수 있음을 제안 #rubyonrails에서

(rdb:1) p user.height_feet 
nil 
(rdb:1) p user.height_inches 
nil 
(rdb:1) p invalid_height.first 
1 
(rdb:1) p invalid_height.second 
8 

사람과 물어 내 사용자는 내 beforeit 블록이 다른 사용자를 나타낼 수 있다고 정의됩니다. 동일한 사양의 파일에서 다른 테스트를 수행했기 때문에 이것이 문제가 될 것이라고는 생각하지 않았습니다. beforeit 블록은 정상적으로 실행됩니다. 생각?

답변

2

코드가하는 일을 생각해 봐야합니다.

각각을 통과하여 beforeit "should not be valid" 을 생성하지만 이들은 모두 동일한 범위에서 평가됩니다.

그래서 그래서 모든 테스트의 결과가 기본적으로 그냥

before do 
    user.height_feet = "" 
    user.height_inches = "" 
end 

it "should not be valid" do 
    debugger 
    user.should_not be_valid 
end 
당신은 before 블록

before do 
    user.height_feet = 1 
    user.height_inches = 8 
end 

before do 
    user.height_feet = 8 
    user.height_inches = 2 
end 

... 

before do 
    user.height_feet = "" 
    user.height_inches = "" 
end 

의 부하를 생성 그리고 당신은 it 블록

it "should not be valid" do 
    debugger 
    user.should_not be_valid 
end 

it "should not be valid" do 
    debugger 
    user.should_not be_valid 
end 

... 

it "should not be valid" do 
    debugger 
    user.should_not be_valid 
end 

의 부하를 생성

나는 당신의 의도가 아니라고 생각합니다.

확실한 해결 방법은 context 블록을 사용하는 것입니다. 이렇게하면 각 명령문 쌍을 문맥에 넣을 수 있습니다.

[[1, 8], [8, 2], [5, 13], ['text', 'text'], ['text', 11], [5, 'text'], ['', ''] 
].each do |feet, inches| 
    context "with an invalid height of #{feet} feet, #{inches} inches" do 

    before do 
     user.height_feet = feet 
     user.height_inches = inches 
    end 

    it "should not be valid" do 
     debugger 
     user.should_not be_valid 
    end 
    end 
end 
+1

고마워요! 매우 유익한. 저는 루비를 처음 접했을 때'context' 블록에 익숙하지 않습니다. 그러나 더 자세히 알기 위해 살펴 보겠습니다. – Nick

관련 문제