2010-06-28 7 views
9

oluşturun:Shoulda RSpec matchers: on =>: Ben testine Modelimin, onlardan biri olmak Shoulda RSpec matchers bazılarını kullanıyorum

describe Issue do 
    it { should_not allow_value("test").for(:priority) } 
end 

Bu benim sorun olduğunu benim modelinde benim doğrulama şuna benzer: Bu testi çalıştırırken

validates_format_of :priority, :with => /^(Low|Normal|High|Urgent)$/, :on => :update 

Yani olsun:

doğrulama tetiklenen değil
1) 'Issue should not allow priority to be set to "test"' FAILED 
    Expected errors when priority is set to "test", got errors: category is invalid (nil)title can't be blank (nil)profile_id can't be blank (nil) 

beca sadece bir güncelleme üzerinde çalışır, bu shoulda eşleştiricileri bir güncelleme veya bir oluşturmada nasıl kullanabilirim?

cevap

12

Bence shoulda bunu daha iyi halletmeli. Bu işe girdim çünkü yalnızca yeni kullanıcılar oluştururken Kullanıcı modelim için benzersiz doğrulama kontrolümü çalıştırmak istiyorum. Ben adları değiştirilmesine izin vermez, çünkü güncelleme üzerine yaptığını, bir veritabanı sorgusu kaybıdır:

Neyse
validates :username, :uniqueness => { :case_sensitive => false, :on => :create }, 

açıkça "konusu" tanımlayarak bu sorunun üstesinden gelebilirsiniz:

describe "validation of username" do 
     subject { User.new } 
     it { should validate_uniqueness_of(:username) } 
    end 

Bu şekilde yalnızca yeni bir örnek üzerinde test ediliyor. Davanız için, muhtemelen gerekli olan tüm alanların ayarlanmasıyla konuyu zaten veritabanında kayıtlı bir şey olarak değiştirebilirsiniz.

+0

Teşekkürler @endium. Benzer şekilde, 'subject {FactoryGirl.create (: user)}', 'on: update' yalnızca doğrulamaları test etmek için kullanılabilir. – scarver2