2012-03-27 88 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作为局部变量。