2011-01-13 4 views

ответ

15

Или используйте Shoulda:

before do 
    @user = Factory(:user) 
end 

subject { @user } 

it { should validate_uniqueness_of(:name) } 
14
class Foo < ActiveRecord::Base 
    validates_uniqueness_of :name 
end 

# spec 
describe Foo do 
    it "should have a unique name" do 
    Foo.create!(:name=>"Foo") 
    foo = Foo.new(:name=>"Foo") 
    foo.should_not be_valid 
    foo.errors[:name].should include("has already been taken") 
    end 
end 
+1

Я не знаю, о "включают в себя", это действительно здорово. –

+3

Функциональность «включить» фактически не предоставляется RSpec. Вместо этого, когда используется в этом контексте, RSpec просто ищет метод «include?» на объект. Класс String предоставляет этот метод. В то же время вы можете использовать другие методы String, такие как «should end_with (« foobar ») и т. Д. –

+0

Не является ли foo.errors [: name] массивом здесь? – Chandranshu

3

Сделать короче с Shoulda:

it "validates uniqueness of name" do 
    FactoryGirl.create(:tag, name: 'unique name') 
    should validate_uniqueness_of(:name) 
end 
+0

... и если вам случится его охватить: it {должен validate_uniqueness_of (: name) .scoped_to (: user_group_id)} – Rin

2
class User < ActiveRecord::Base 
    validates_uniqueness_of :name 
end 


it "should validate uniqueness of name" do 
    user1 = FactoryGirl.create(:user) 
    user1.save 
    user2 = FactoryGirl.build(:user) 
    expect { user2.save! }.to raise_error(
    ActiveRecord::RecordInvalid 
)  
end 
Смежные вопросы