我正在使用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'
答案 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作为局部变量。