2009-09-26 21 views
6

Rails Unittests'deki validasyonları test etmek için temiz ve kısa kod arıyorum.Test için basit sözdizimi Doğrulama hataları

Şu anda sanırım bu

test "create thing without name" do 
    assert_raise ActiveRecord::RecordInvalid do 
     Thing.create! :param1 => "Something", :param2 => 123 
    end 
end 

gibi bir şey de doğrulama mesajı gösterir daha iyi bir yol yoktur do?

Çözüm: Ek bir çerçeve olmadan

Benim şimdiki çözüm:

test "create thing without name" do 
    thing = Thing.new :param1 => "Something", :param2 => 123 
    assert thing.invalid? 
    assert thing.errors.on(:name).any? 
end 
+0

cevaplar için Rspec'i ve diğerlerini biraz zaman deneyeceğim. Şimdilik kendimden (kayıt.invalid?) Ve assert_equal ([], record.errors.full_messages) – Roman

cevap

6

Sen kullandığınız bu ne test çerçevesi söz etmeyin. Birçoğunun test activerecord'u bir araya getiren makroları var.

thing = Thing.new :param1 => "Something", :param2 => 123 
assert !thing.valid? 
assert_match /blank/, thing.errors.on(:name) 
+0

ile kendime yardım ediyorum. Şu anda sadece düz Rayları kullanıyorum. – Roman

+1

Rails 3'ten itibaren ActiveModel :: Errors için "on" yöntemi yoktur. http://stackoverflow.com/questions/7526499/undefined-method-on-for-actionmodel –

+1

Bu cevap tarihli olabilir, ancak 'assert_match' bir dizide çalışmaz. –

0

Sen rspec-on-rails-matchers denemeye olabilir:

İşte herhangi bir test yardımcıları kullanmadan bunu yapmak için "uzun bir yol" var. gibi sözdizimi sağlar: Ayrıca

@thing.should validates_presence_of(:name) 
+0

Sayfa diyor ki: Beni kullanma. Tarihim bitti ve shoulda'yı kırarım. Shoulda şimdi rspec ile çalışıyor. Bunu kullan. – Roman

1

deneyin accept_values_for mücevher. O böyle bir şey yapmak için izin verir: Eğer ben Rails 2.0.5 kullanıyorum kolayca

1

gerçekten karmaşık doğrulamaları test edebilirsiniz Bu şekilde

describe User do 

    subject { User.new(@valid_attributes)} 

    it { should accept_values_for(:email, "[email protected]", "[email protected]") } 
    it { should_not accept_values_for(:email, "invalid", nil, "[email protected]", "[email protected]") } 
end 

ve ben iddia istediğinizde bir modeli başarısız olacağını Doğrulama, ben errors.full_messages method kontrol ve beklenen mesajların bir dizi ile karşılaştırın.

created = MyModel.new 
created.field1 = "Some value" 
created.field2 = 123.45 
created.save 

assert_equal(["Name can't be blank"], created.errors.full_messages) 

Doğrulamanın başarılı olduğunu iddia etmek için boş bir diziyle karşılaştırıyorum. Rails denetleyicisinin, bir oluşturma veya güncelleştirme isteğinden sonra hata iletileri olmadığından emin olmak için çok benzer bir şey yapabilirsiniz.

def assert_invalid(record, options) 
    assert_predicate record, :invalid? 

    options.each do |attribute, message| 
    assert record.errors.added?(attribute, message), "Expected #{attribute} to have the following error: #{message}" 
    end 
end 

sağlar:

assert record.errors.added? :name, :blank 

Şöyle bir test yardımcıyı kullanın:

assert_difference('MyModel.count') do 
    post :create, :my_model => { 
    :name => 'Some name' 
    } 
end 

assert_equal([], assigns(:my_model).errors.full_messages) 
assert_redirected_to my_model_path(assigns(:my_model)) 
1
kullananlara Raylar 3.2.1 için

ve yukarı, ben added? yöntemi kullanmayı tercih Bu gibi testler yazmak için:

test "should be invalid without a name" do 
    user = User.new(name: '') 

    assert_invalid user, name: :blank 
end 
İlgili konular