FactoryGirl не дает полезных ошибок проверки - PullRequest
3 голосов
/ 22 марта 2012

Я использую FactoryGirl для своих приборов и обнаруживаю, что на самом деле она не выдает полезных ошибок проверки.

Я всегда получаю сообщение для activerecord.errors.models.messages.record_invalid.

Не уверен, какие дополнительные сведения необходимы для диагностики этого. Это делает мучительно медленный процесс отслеживания каждой ошибки.

Пример фабрики:

Factory.define :partner do |partner|
  partner.sequence(:username){ |n| "amcconnon#{n}" }
  partner.first_name            "Bobby Joe"
  partner.last_name             "Smiley"
  partner.sequence(:email){ |n| "bob{n}@partners.com" }
  partner.phone_number          "5557 5554"
  partner.country_id            75
  partner.password              "password"
  partner.password_confirmation "password"
end

Тогда Factory (: partner) => «ActiveRecord :: RecordInvalid Исключение: похоже, что-то пошло не так с этими изменениями»

Фактическая проблема, конечно, в том, что последовательность электронной почты не использует n должным образом, и существует уникальная проверка по электронной почте. Но это в иллюстративных целях.

рельсы => 3.2.2 factory_girl 2.6.1

Какие-нибудь другие deets, необходимые, чтобы помочь диагностировать это?

(Примечание: отредактировал это просто для того, чтобы добавить более удобочитаемую фабрику)

РЕДАКТИРОВАТЬ:

Согласно комментарию Биджана: «Что именно я пытаюсь сделать».

Попытка запустить "rspec spec". Я хотел бы, чтобы в этом случае я использовал фабрику, такую ​​как Factory (: partner), для сообщения об ошибке, когда в нем не содержится та же ошибка, которую я получил бы от Partner.new ({blah ...}). Valid? затем посмотрел на ошибки проверки.

Ответы [ 2 ]

3 голосов
/ 17 февраля 2014

Я не уверен, что это точно та же проблема, что и у вас, но у меня была проблема с сообщениями об ошибках валидации, которые не очень полезны, и я подумал, что это может быть полезно для других, ищущих эту проблему. Ниже то, что я придумал. Это можно изменить, чтобы получить другую информацию.

include FactoryGirl::Syntax::Methods

# Right after you include Factory Girl's syntax methods, do this:

def create_with_info(*args, &block)
  create_without_info(*args, &block)
rescue => e
  raise unless e.is_a? ActiveRecord::RecordInvalid
  raise $!, "#{e.message} (Class #{e.record.class.name})", $!.backtrace
end
alias_method_chain :create, :info

Затем, когда вы используете create :model_name, оно всегда будет включать название модели в сообщение об ошибке. У нас были довольно глубокие зависимости (да, еще одна проблема), и была ошибка проверки, например, «имя неверно» ... и name был атрибутом в нескольких разных моделях. С этим добавленным методом это экономит значительное время отладки.

0 голосов
/ 01 апреля 2012

Я думаю, что ключевым моментом здесь является то, что когда вы настраиваете тест, вам нужно убедиться, что код, который вы тестируете, дает сбой в момент, когда вы устанавливаете ожидание (т.е. когда вы говорите «должен» в Rspec).Конкретная проблема с проверкой проверок состоит в том, что проверка завершается неудачно, как только вы пытаетесь сохранить объект ActiveRecord;таким образом, настройка теста не должна вызывать save.

Особые предложения:

1) Определения фабрики IMO должны содержать минимальную информацию, необходимую для создания действительного объекта, и должны изменяться как можно меньше.Если вы хотите проверить проверки, вы можете переопределить определенный проверяемый атрибут при создании экземпляра нового объекта тестирования.

2) При проверке проверок используйте Factory.build.Factory.build создает экземпляр ActiveRecord с указанными атрибутами, но не пытается его сохранить;это означает, что вы можете отложить запуск проверки до тех пор, пока не установите ожидание в тесте.

Как насчет этого?

it "should fail to validate a crap password" do
  partner_with_crap_password = Factory.build(:partner, :password => "crap password")
  partner_with_crap_password.should_not be_valid
end
...