2013-08-02 22 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

這是有道理的,所以我試了一下。我在零時收到了NoMethodError。如果你追蹤流程,它實際上在前面的塊之前執行,相信或不相信。所以,@feed_with_same_url當時爲零。這些描述貫穿整個過程,然後對它收集的每個過程執行之前的過程......至少這是我所見過的流程。 –

+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 } 

現在it是主體,這是feed_with_same_url

+0

我應該提到的是,只會驗證是在模型和代碼的其餘部分是水豚在feed_spec.rb構建。我相信這是標準編碼。我將着手研究它是否能說出它選擇的是什麼。 –

+0

你完全沒有使用水豚,這是一個模型規範。 – sevenseacat

+0

我的意思是原始問題格式不正確。更新問題以澄清此問題。 –