rspec: ошибка в атрибуте (который существует) не найден - PullRequest
2 голосов
/ 21 января 2011

У меня есть некоторые проблемы при спецификации валидации моей модели, которая действует как конечный автомат (gem state_machine 0.9.4). С помощью stat_machine я определил проверку для велосипедов в состоянии доставки:

state :delivered do
  validates_presence_of :shipping_number
end

в моих спецификациях это работает правильно:

it "may not transit to :delivered without a shipping number " do
  @bike.state = 'delivered'
  @bike.shipping_number = nil
  @bike.save
  @bike.should have(1).error_on(:shipping_number)
end

но при спецификации так:

it "may not transit to :delivered without a shipping number " do
  @bike.shipping_number = nil
  @bike.deliver
  @bike.should have(1).error_on(:shipping_number)
end

Я получаю:

expected 1 error on :shipping_number, got 0

хотя

it "may not transit to :delivered without a shipping number " do
  @bike.shipping_number = nil
  @bike.deliver
  raise @bike.errors.inspect
end

показывает мне:

Failure/Error: raise @bike.errors.inspect
#<OrderedHash {:shipping_number=>["can't be blank"]}>

Может кто-нибудь объяснить это?

1 Ответ

1 голос
/ 07 декабря 2011

Проверьте эту ссылку здесь, это объясняет проблему: http://web.archive.org/web/20130202082209/http://agaskar.com/post/1627270986/fun-state-machine-rspec-gotcha

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

Хотя, вероятно, есть более идиоматический способ сделать это, я сделал что-то подобное в спецификации:

@bike.errors.include?(:shipping_number).should == true
...