2009-09-26 3 views
6

Я ищу чистый и короткий код для проверки валидации в Rails Unittests.Простой синтаксис для проверки Ошибки проверки

В настоящее время я делаю что-то вроде этого

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

Я предполагаю, что есть лучший способ, который также показывает сообщение проверки?

Решение:

Мое текущее решение без дополнительных рамок является:

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

Thank s для ответов. Я попробую rspec и остальных некоторое время. На данный момент я помогаю себе утверждать (record.invalid?) И assert_equal ([], record.errors.full_messages) – Roman

ответ

6

Вы не упоминаете, что тестирование рамки, которые вы используете. У многих есть макросы, которые делают тестирование activerecord легким.

Вот «долгий путь», чтобы сделать это без использования каких-либо тесты помощников:

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

Я использую только простые Rails на данный момент. – Roman

+1

В Rails 3 нет метода «on» для ActiveModel :: Errors. http://stackoverflow.com/questions/7526499/undefined-method-on-for-actionmodel –

+1

Этот ответ может быть устаревшим, но 'assert_match' не работает в массиве. –

0

Вы могли бы дать rspec-on-rails-matchers попробовать. Предоставляет вам синтаксис, как:

@thing.should validates_presence_of(:name) 
+0

На странице написано: Не используйте меня. Я устал, и я разорвусь. Теперь Shoulda работает с rspec. Используйте это. – Roman

1

Try также accept_values_for камень. Это позволяет сделать что-то вроде этого:

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 

Таким образом, вы можете проверить действительно сложные валидации легко

1

Я использую Rails 2.0.5, и когда я хочу, чтобы утверждать, что модель потерпит неудачу проверки, я проверяю errors.full_messages method и сравниваю его с массивом ожидаемых сообщений.

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

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

Чтобы утверждать, что проверка прошла успешно, я просто сравниваю с пустым массивом. Вы можете сделать что-то очень похожее, чтобы проверить, что контроллер Rails не имеет сообщений об ошибках после запроса на создание или обновление.

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

Для тех, кто использует Rails 3.2.1 и выше, я предпочитаю использовать added? метод:

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

я использую тест помощника, который выглядит следующим образом:

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 

, который позволяет мне написать такие тесты:

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

    assert_invalid user, name: :blank 
end 
Смежные вопросы