2012-03-27 172 views
2

我使用ruby 1.9.2和rails 3.2.2。RSpec測試不會通過。使用域名驗證唯一性

我有一個 '域' 模型(domain.rb):

class Domain < ActiveRecord::Base 
    attr_accessible :url 
    belongs_to :user 

    VALID_DOMAIN_REGEX = /^[a-z0-9\-\.]+\.[a-z]{2,}$/i 
    validates :url, presence:true, 
       format: { with: VALID_DOMAIN_REGEX }, 
       uniqueness: { case_sensitive: false } 

end 

和測試斷言重複的域名不應該是有效的:

require 'spec_helper' 

describe Domain do 

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

    subject { @domain } 

    describe "when domain url is already taken" do 
    before do 
     domain_with_same_url = @domain.dup 
     domain_with_same_url.url = @domain.url.upcase 
     domain_with_same_url.save 
    end 
    it { should_not be_valid } 
    end 
end 

測試不停地進行故障:

1) Domain when domain url is already taken Failure/Error: it { should_not be_valid } expected valid? to return false, got true # ./spec/models/domain_spec.rb:31:in `block (3 levels) in '

回答

3

@domain已經創建,驗證和保存。

domain_with_same_url是新記錄,它應該是無效的。但是你沒有檢查它。

嘗試

domain_with_same_url = FactoryGirl.create(:domain, :url => @domain.url.upcase) 
domain_with_same_url.should_not be_valid 
+0

感謝您的幫助!現在意識到我在概念上缺少一個大項目:)應該幫助我繼續這個測試的東西。 – jessem 2012-03-27 21:38:08

0

您的兩個before模塊在運行外到內的順序。因此,在運行測試套件時,首先創建並保存@domain對象,然後執行內部的before塊。 Hiwever,您的domain_with_same_url可能從未實際保存,因爲它的驗證失敗,可能會導致domain_with_same_url.save返回false。

作爲一種變通方法,你可以檢查的domain_with_same_url,而不是@domain有效性。

0

好像你對你的測試用例subject@domain,這是一個有效的對象。是否使用@domain_with_same_url的新主題(不要忘記將其作爲實例變量),或者明確地說domain_with_same_url.should ...(就像他在答案中指出的那個人一樣)。

0

我剛剛在Rails 4 Model column uniqueness not working中遇到同樣的問題。它提供了另外兩個解決方案,沒有第二次調用FactoryGirl,只是FYI。我正在使用的是:

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 } 

保存導致一些問題,對我來說意想不到。而且,您需要將一個對象引用爲should_not_be_valid作爲局部變量。