Простой синтаксис для проверки ошибок проверки

Я ищу чистый и короткий код для проверки валидаций в 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

5 ответов


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

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

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

попробуйте accept_values_for камень. Он позволяет сделать что-то вроде этого:

describe User do

  subject { User.new(@valid_attributes)}

  it { should accept_values_for(:email, "john@example.com", "lambda@gusiev.com") }
  it { should_not accept_values_for(:email, "invalid", nil, "a@b", "john@.com") }
end

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


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

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))

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

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

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

@thing.should validates_presence_of(:name)