#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. Я немного отредактировал ваш ответ. Пожалуйста, убедитесь, что он по-прежнему читается нормально для вас.