2009-09-26 23 views
6

Poszukuję czystego i krótkiego kodu do testowania sprawdzania poprawności w Rails Unittests.Prosta składnia do testowania Błędy sprawdzania poprawności

Obecnie zrobić coś takiego

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

Chyba nie ma lepszego sposobu, który pokazuje również wiadomość walidacji?

Rozwiązanie:

Moje obecne rozwiązanie bez dodatkowych ram to:

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

Dziękuję s dla odpowiedzi. Spróbuję rspec i inni trochę czasu. Na razie pomagam sobie z assert (record.invalid?) I assert_equal ([], record.errors.full_messages) – Roman

Odpowiedz

6

Nie wspominając co testowania ramy, które używasz. Wiele z nich ma makra, które sprawiają, że testowanie jest aktywne i natychmiastowe.

Oto „długa droga” to zrobić bez użycia żadnych pomocników testowe:

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

Używam tylko zwykłych Railsów. – Roman

+1

Od Rails 3 nie ma metody "on" dla ActiveModel :: Errors. http://stackoverflow.com/questions/7526499/undefined-method-on-for-actionmodel –

+1

Ta odpowiedź może być datowana, ale 'assert_match' nie działa w tablicy. –

0

Można dać rspec-on-rails-matchers spróbować. Udostępnia składnię:

@thing.should validates_presence_of(:name) 
+0

Strona mówi: Nie używaj mnie. Jestem nieaktualny i łamam shouldę. Powinien teraz pracować z rspec. Użyć tego. – Roman

1

Używam Rails 2.0.5 i gdy chcę twierdzić, że model nie powiedzie sprawdzanie poprawności, sprawdzam wartość errors.full_messages method i porównuję ją z tablicą oczekiwanych komunikatów.

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

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

Aby potwierdzić, że walidacja się udaje, po prostu porównuję do pustej tablicy. Możesz zrobić coś bardzo podobnego, aby sprawdzić, czy kontroler Railsów nie ma komunikatów o błędach po utworzeniu lub aktualizacji.

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

dla osób korzystających Rails 3.2.1 i nawet wolę stosując metodę added?:

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

używam pomocnika testu, który wygląda tak:

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 

który pozwala do napisania testów takich jak:

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

    assert_invalid user, name: :blank 
end 
Powiązane problemy