Как написать rspec для пустого поля? [Rails3.1]

#ruby-on-rails #ruby #rspec

#ruby-on-rails #ruby #rspec

Вопрос:

Я использую rails 3.1 rspec и factory girl.

Моя проверка требуемого поля (validate_presence_of) работает. Как мне заставить тест использовать этот факт как «успех», а не как «сбой»
. Спецификация:

 describe "Add an industry with no name" do
  context "Unable to create a record when the name is blank" do
    subject do
      ind = Factory.create(:industry_name_blank)
    end
    it { should be_invalid }
  end
end
  

но я получаю сбой:

 Failures:

  1) Add an industry with no name Unable to create a record when the name is blank 
     Failure/Error: ind = Factory.create(:industry_name_blank)
     ActiveRecord::RecordInvalid:
       Validation failed: Name can't be blank
     # ./spec/models/industry_spec.rb:45:in `block (3 levels) in <top (required)>'
     # ./spec/models/industry_spec.rb:47:in `block (3 levels) in <top (required)>'

Finished in 0.20855 seconds
8 examples, 1 failure
  

Код модели:

 class Industry < ActiveRecord::Base
  validates_presence_of :name
  validates_uniqueness_of :name
end
  

Заводской код:

 Factory.define :industry_name_blank, :class => 'industry' do |industry|
  industry.name   { nil }
end
  

Ответ №1:

Вот пример… тема заполняется «Industry.new» по соглашению

 describe Industry do

  it "should have an error on name when blank" do
    subject.name.should be_blank
    subject.valid?
    subject.should have(1).error_on(:name)
    #subject.errors.on(:name).should == "is required"
  end

end
  

Последнее немного более хрупкое, но вы могли бы это сделать

Подробнее о синтаксисе: http://cheat.errtheblog.com/s/rspec /

Комментарии:

1. 1 для ссылки на блог… Я искал что-то подобное

2. Нет, — Сбои: ` 1) Добавление отрасли без имени должно иметь ошибку в имени при сбое / ошибке с пробелом: subject.name.should be_blank NoMethodError: name' for "Add an industry with no name":String # ./spec/models/industry_spec.rb:44:in блок неопределенного метода (2 уровня) в <top (обязательно)>’ Завершено за 0,19527 секунды 8 примеров, 1 сбой`

3. как вы можете видеть, освобождает атрибут factory, хотя name он существует

4. хотя я тоже буду 1 для ссылки на блог!

5. Я попытался: описать «Добавить пустую отрасль «, сделать перед (:each), выполнить @industry = Factory(:industry_name_blank), завершить «должно быть ошибка в имени, когда пусто», сделать @industry.should_not be_valid @industry.name.valid? @industry.should have(1).error_on(:name) #@industry.errors.on(:name). должен == «требуется» end end, но я получаю Failures: 1) Add an industry with no name should have an error on name when blank Failure/Error: @industry = Factory(:industry_name_blank) ActiveRecord::RecordInvalid: Validation failed: Name can't be blank

Ответ №2:

Factory.build(:industry_name_blank) генерирует объект во время Factory.create(:industry_name_blank) создания и сохранения созданного объекта. В вашем случае он не может сохранить объект, потому что он недействителен из-за отсутствия name , поэтому вы получаете ошибку проверки.

Поэтому вместо использования create use build , чтобы избежать ошибок проверки: Factory.build(:industry_name_blank) . Тогда вы должны быть в состоянии указать это, как предлагает Джесси:

 subject.should_not be_valid
subject.should have(1).error_on(:name)
  

Комментарии:

1. Эй, это отличное объяснение этих двух. 1 Спасибо, Якоб 🙂

2. Я немного отредактировал ваш ответ. Пожалуйста, убедитесь, что он по-прежнему читается нормально для вас.