0
class User 
    #... 
    validates :debit_card_status_change_date, 
    timeliness: { type: :date, allow_blank: true } 
    #... 
end 

Спецификация:Shoulda :: Matchers :: ActiveModel :: AllowValueMatcher :: CouldNotSetAttributeError

it { is_expected.to allow_value(nil).for(:debit_card_status_change_date) } 
it { is_expected.to allow_value("").for(:debit_card_status_change_date) } 
it { is_expected.not_to allow_value("abc").for(:debit_card_status_change_date) } 

Почему второй и третий тест терпят неудачу?

Failure/Error: it { is_expected.to allow_value("").for(:debit_card_status_change_date) } 
    Shoulda::Matchers::ActiveModel::AllowValueMatcher::CouldNotSetAttributeError: 
    Expected Class to be able to set debit_card_status_change_date to "", but got nil instead. 

Failure/Error: it { is_expected.not_to allow_value("abc").for(:debit_card_status_change_date) } 
    Shoulda::Matchers::ActiveModel::AllowValueMatcher::CouldNotSetAttributeError: 
    Expected Class to be able to set debit_card_status_change_date to "abc", but got nil instead. 

Все работало перед обновлением от rails4.0, RSpec 2 и Shoulda-matchers 2.xx рельсам 4.2, RSpec 3.3.1 и Shoulda-matchers 3,0

ответ

1

К сожалению у вас возникли проблемы с последний релиз.

Начиная с версии 3.0 было внесено еще одно изменение, в котором allow_value вызовет ошибку, если значение, которое вы предоставляете совпадению, и значение, которое фактически использует модель при выполнении проверки, не совпадают. В этом случае вы пытаетесь установить "" и "abc" на столбец, который заканчивается приведением этих значений в nil (так как это столбец даты). Все это принципиально разные значения, поэтому собеседник путается и не знает, как это интерпретировать.

У вас есть два решения:

  1. Удалите тесты для "" и "abc". Поскольку они преобразуются в нуль, вы, по сути, повторяете один и тот же тест дважды.
  2. Если вы хотите сохранить эти тесты в любом случае, вы можете добавить ignore_interference_by_writer в конец (после for), и это скажет совпадению игнорировать любые изменения значений.
+0

Думаю, я понял это, получая сообщения об ошибках, и это было то, что я сделал - удаление '' '' и '' abc '' тестов. Спасибо за подробный ответ! –

Смежные вопросы