RSpec测试不会通过。使用域名验证唯一性

时间:2012-03-27 20:02:10

标签: ruby-on-rails ruby rspec

我正在使用ruby 1.9.2和rails 3.2.2。

我有一个'域'模型(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)域名网址已被占用时的域名        失败/错误:它{should_not be_valid}          预期有效吗?返回虚假,得到了真实        #./spec/models/domain_spec.rb:31:in'块(3级)in'

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

您的两个before块按外向内顺序运行。因此,在运行测试套件时,首先创建并保存@domain对象,然后执行内部before块。好吧,您的domain_with_same_url可能永远不会被实际保存,因为它的验证失败,可能会导致domain_with_same_url.save返回false。

作为解决方法,您可以检查domain_with_same_url而非@domain的有效性。

答案 2 :(得分:0)

您的subject测试用例似乎是@domain,这是一个有效的对象。是否使用@domain_with_same_url的新主题(不要忘记将其设为实例变量),或明确说出domain_with_same_url.should ...(就像他在答案中指出的那样)。

答案 3 :(得分: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作为局部变量。