2013-08-02 3 views
1

이것은 간단해야하지만 작동하지 않는 이유를 알 수 없습니다. 더 많은 독창적 인 구조를 많이 보았습니다. 나는 유일한 색인이어야하는 란이있다. 필자는 모델에서 옵션을 테스트하기 위해 두 번 지정했지만 고유성 테스트는 계속 실패합니다.레일 4 모델 열의 고유하지 않음

모델 유효성 검사 코드 :

validates :feed_url, presence:true, 
      format:  {with: VALID_URL_REGEX}, 
      uniqueness: true 
    validates_uniqueness_of :feed_url 

RSpec에 코드 :

before do 
    @feed = FactoryGirl.create(:feed) 
    end 
... 

    describe "when URL is already taken" do 
    before do 
     feed_with_same_url = @feed.dup 
     feed_with_same_url.feed_url = @feed.feed_url 
     feed_with_same_url.save 
    end 
    it { should_not be_valid } 
    end 

가 저장이 유효하지 말아야하지만 모델이이 분야가 동일한 경우에도 유효 말한다 때문에 테스트가 실패합니다. 나 자신을 브레이크 포인트에서 필드를 체크하고 정확히 같은 경우, 길이, 값, 등등입니다.

존재 여부 및 정규식 유효성 테스트가 완벽하게 작동하므로 모델이 작동합니다.

인덱스 대신 모델에서이 작업을 수행하려고합니다. 나는 지난 밤에 Rails 4가 데이터베이스 대신 코드에서 이러한 테스트를 선호한다는 것을 읽었지 만, 나는 그 소스를 오늘 밤에 찾을 수 없습니다. (?) 어느 쪽이든, 나는 모델이 작동하는지보고 싶습니다.

+0

이 특별한 질문에 도움이되지는 않지만 시험에 도움이 될 수 있습니다. https://github.com/thoughtbot/shoulda- matchers – Benj

+0

매우 흥미롭고 고맙습니다. 이 스레드를 통해 알 수 있듯이, 나는 지금 테스트 메소드에 약간 오버로드되어있다. 그러나 나중에 이것을 위해 가방에 저장하겠습니다. –

답변

1

일부 개체에는 should_not be_valid (으)로 전화해야합니다. 시험해보십시오

before(:each) do 
    @feed_with_same_url = @feed.dup 
    @feed_with_same_url.feed_url = @feed.feed_url 
end 
it { @feed_with_same_url.should_not be_valid } 
+0

이것은 의미가있어, 나는 그것을 시도했다. Nil에 NoMethodError를 받았습니다. 흐름을 추적하면 실제로 블록 이전에 실행됩니다. 믿지 않거나하지 않습니다. 따라서 @feed_with_same_url은 그 시점에 nil입니다. 설명은 그것을 통해 실행 된 다음 수집 한 각각에 대해 이전을 실행합니다 ... 적어도 내가 본 흐름입니다. –

+0

': each' 옵션을 메소드 호출 전에 전달하십시오. 내 대답을 업데이트했습니다 – Santhosh

+0

좋아, 그 일했다. 내 마음을 불어 넣지 만 효과가있다. 나는 그들이 모델을 운전했다고 믿었 기 때문에 생성/저장 방법을 보여주었습니다. 당신은 구원을 가져 갔고 효과가있었습니다. 나는 정말로 이해하지 못한다.이걸 좀 더 자세히 설명해 주시겠습니까? 정말 고마워. –

1

해당 테스트와 관련하여 it은 무엇입니까? 전체 코드가 없으면 feed_with_same_url이 아니므로 테스트에서 생각하는 바를 검사하지 않습니다.

let(:feed) { FactoryGirl.create :feed } 
let(:feed_with_same_url) { feed.dup } 

subject { feed_with_same_url } 

it { should_not be_valid } 

지금 itfeed_with_same_url있는 주제입니다 :이 테스트를 작성하는 경우

, 그것은 무언가 같이 될 것입니다.

+0

유효성 검증은 모델에 있고 나머지 코드는 feed_spec.rb에있는 Capybara 구문이라는 것을 언급해야합니다. 나는 이것이 표준 코딩이라고 생각한다. 나는 자기가 무엇을 선택하고 있는지 말할 수 있는지 알아 내기 위해 노력할 것이다. –

+0

당신은 Capybara를 전혀 사용하지 않고 있습니다. 이것은 모델 사양입니다. – sevenseacat

+0

원래 질문의 형식이 잘못되었다는 것을 의미했습니다. 이 문제를 명확히하기 위해 질문이 업데이트되었습니다. –