Rails 3: повторяющиеся сообщения об ошибках валидации во время тестирования - PullRequest
9 голосов
/ 23 сентября 2011

У меня странное поведение при проверке: оно дублирует мои сообщения об ошибках проверки, и я не могу понять, что его вызывает ... это не происходит в консоли rails.

Вот подтверждение от моей модели телефона:

# phone.rb
validates :number, :length => { :minimum => 3 }

Моя спецификация:

require 'spec_helper'

describe Phone do
  it "requires a number" do
    user = User.make!
    @p = Phone.new(number:nil,user_id:user.id,type:2)
    @p.valid?
    puts @p.errors.inspect 
    @p.should have(1).error_on(:number)
  end

Результаты моего теста:

# rspec and machinist
#<ActiveModel::Errors:0x000000036f1258 @base=#<Phone id: nil, user_id: 614, kind: nil, number: nil, created_at: nil, updated_at: nil>, @messages={:number=>["is too short (minimum is 3 characters)", "is too short (minimum is 3 characters)"]}>
F

Failures:

  1) Phone requires a number
     Failure/Error: @p.should have(1).error_on(:number)
       expected 1 error on :number, got 2
     # ./spec/models/phone_spec.rb:11:in `block (2 levels) in <top (required)>'

Finished in 0.50988 seconds
1 example, 1 failure

Как видите, я получаю "слишком коротко (минимум 3 символа)" дважды ... Это также / только / происходит во время тестирования. Есть идеи?

Спасибо!

Ответы [ 4 ]

9 голосов
/ 09 августа 2012

Проблема в строке:

Dir["#{Rails.root}/app/**/*.rb"].each { |f| load f }

в файле spec_helper.rb, в блоке Spork.each_run

Если вы измените метод load на 'require', это решает проблему.

Или, если у вас достаточно свежая версия Spork, вы можете полностью удалить строку.Я почти уверен, что ошибка вызвана тем, что кто-то устанавливает более новую версию Spork (0.9.0+) со старыми инструкциями, потому что строка:

Dir["#{Rails.root}/app/**/*.rb"].each { |f| load f }

даже не должна быть явно указана вspec_helper.rb файл больше.Если это так, когда метод load используется в файле spec_helper.rb, он перезагружает указанные файлы, что, скорее всего, является причиной странных ошибок проверки дубликатов RSpec.

1 голос
/ 17 февраля 2013

Я столкнулся с похожей проблемой повторяющихся сообщений об ошибках, но, похоже, это связано с моим использованием структуры каталогов, отличной от стандартной, например ::10000

- app
  \- models_one
  |- models_two
  |- models_three

Мой load / require вызов в блоке Spork.each_run выглядел так:

Dir["#{Rails.root}/app/models_*/*.rb"].each { |f| load f }

Я удалил это и заменил на эти:

ActiveSupport::Dependencies.clear
ActiveRecord::Base.instantiate_observers

И больше не было повторяющихся сообщений об ошибках.

Мне помогло это сообщение: http://adams.co.tt/blog/2012/04/12/duplicate-active-model-validation-errors/, в котором автор говорит, что это специфичная для 1.8.7 проблема, которая требует разных путей, которые разрешают один и тот же файл, но я использую 1.9.3, поэтому может быть не связано.

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

У меня та же проблема (я использую rspec & spork).

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

Если вы эксплицируете require 'phone' в верхней части вашей спецификации, похоже, это исправлено.

Но мне бы очень хотелось узнать, в чем причина проблемы ...

0 голосов
/ 14 марта 2012

Я не уверен, что это решит вашу проблему, но rspec очень изворотлив, если вы не следуете соглашению rspec.Попробуйте еще один идиоматический rspec, например, такой:

требует 'spec_helper'

describe Phone do
  context :validations do
    let(:user) { double(:user) }
    subject { Phone.new(number:nil,user_id:user.id,type:2) }

    before do
      subject.valid?
    end

    it 'should have a minimum length of 3' do
      subject.should have(1).error_on(:number)
    end
  end
end

Я также хотел бы предложить вам не проверять встроенные валидации Rails модульного тестирования;они уже проверены в самих Rails.В частности, ваша проверка длины проверяется в activemodel / test / case / validations / length_validation_test.rb .Поведение проверок должно быть отражено в ваших интеграционных тестах.

Надеюсь, это полезно.

...