2010-06-28 2 views
9

만들 :했어야 RSpec에는 정합 :에 => : 나는 시험에 내 모델, 그들 중 하나가되고를 진작 RSpec에 매처 (matcher)의 일부를 사용하고

describe Issue do 
    it { should_not allow_value("test").for(:priority) } 
end 

이 나의 문제는 내 모델에서 내 검증 다음과 같습니다 :이 테스트를 실행할 때

validates_format_of :priority, :with => /^(Low|Normal|High|Urgent)$/, :on => :update 

그래서 내가 얻을 :

유효성 검사가 트리거되지 않는
1) 'Issue should not allow priority to be set to "test"' FAILED 
    Expected errors when priority is set to "test", got errors: category is invalid (nil)title can't be blank (nil)profile_id can't be blank (nil) 

BECA 업데이트를 실행할 때만 사용하십시오. 업데이트와 작성시 이러한 shoulda matchers를 어떻게 사용할 수 있습니까?

답변

12

나는 이것을 잘 처리해야한다고 생각합니다. 새 사용자를 만들 때 내 사용자 모델에 대한 고유성 검사 만 실행하기 때문에이 문제가 발생했습니다. 나는 사용자 이름 변경을 허용하지 않기 때문에이 업데이트에 그 일을 데이터베이스 쿼리의 낭비 :

다행히
validates :username, :uniqueness => { :case_sensitive => false, :on => :create }, 

명시 적으로 "대상"을 정의하여이 문제를 가져올 수 있습니다

describe "validation of username" do 
     subject { User.new } 
     it { should validate_uniqueness_of(:username) } 
    end 

이 방법은 새로운 인스턴스에서만 테스트합니다. 당신의 경우에는, 당신은 아마 단지 필요한 모든 필드가 설정된 상태에서 이미 데이터베이스에 저장된 어떤 것으로 주제를 변경할 수 있습니다.

+0

감사합니다. @endium. 비슷하게,'subject {FactoryGirl.create (: user)}'는'on : : update' 만 검증을 테스트하는데 사용될 수 있습니다. – scarver2