Избегайте дублирования при тестировании атрибутов модели в RSpec

У меня есть несколько моделей, и в этих моделях у меня есть атрибуты, которые я не хочу оставлять пустыми/пустыми.

Я хочу тщательно протестировать свои модели на эти ограничения, используя RSpec и Factory Girl.

Однако я получаю дублирование кода:

user_spec:

it 'is invalid if blank' do
  expect {
   FactoryGirl.create(:user, nickname => '')
  }.to raise_error(ActiveRecord::RecordInvalid)
end

спецификация_сообщения:

it 'is invalid if blank' do
  expect {
   FactoryGirl.create(:message, :re => '')
  }.to raise_error(ActiveRecord::RecordInvalid)
end

Как я могу это учесть?


person Valentin Trinqué    schedule 08.12.2015    source источник


Ответы (1)


RSpec предоставляет несколько способов сделать это, например Общие примеры.

<сильный>1. Создайте файл в своем [RAILS_APP_ROOT]/support/

Основываясь на вашем примере, вы можете назвать этот файл not_blank_attribute.rb. Затем вам просто нужно переместить дублированный код и адаптировать его, чтобы сделать его настраиваемым:

RSpec.shared_examples 'a mandatory attribute' do |model, attribute|
  it 'should not be empty' do
    expect {
      FactoryGirl.create(model, attribute => '')
    }.to raise_error(ActiveRecord::RecordInvalid)
  end
end

<сильный>2. Используйте функцию it_behaves_like в своих спецификациях

Эта функция вызовет общий пример.

RSpec.describe User, '#nickname' do
  it_behaves_like 'a mandatory attribute', :User, :nickname
end

Наконец, он выводит:

User#nickname
  behaves like a mandatory attribute
      should not be empty
person Valentin Trinqué    schedule 08.12.2015