Должны ли тестеры уникальности проверяться на соответствие недопустимому значению ноль в области видимости - PullRequest
0 голосов
/ 15 февраля 2019

Предполагается, что мой помощник должен проверить уникальность season_storage_id, рассчитанного на эпоху.Это следует делать, игнорируя регистр, так как я увеличиваю ввод перед проверкой.

#app/models/season_storage.rb

before_validation :sanitize_inputs
...   
validates :storage_id, uniqueness: { scope: :epoch }
validates :epoch, presence: true
validates :epoch, format: /\A20[0-9]{2}-(spring|autumn)\Z/
...
def sanitize_inputs
  storage_id.upcase!
end



#spec/models/season_storage.rb

it { is_expected.to validate_uniqueness_of(:storage_id).ignoring_case_sensitivity.scoped_to(:epoch) }

При запуске этого теста происходит нечто неожиданное:

Failure/Error: it { is_expected.to validate_uniqueness_of(:storage_id).ignoring_case_sensitivity.scoped_to(:epoch) }              

       Expected SeasonStorage to validate that :storage_id is unique within the                                                        
       scope of :epoch, but this could not be proved.
         After taking the given SeasonStorage, setting its :storage_id to                                                              
         ‹"dummy value"›, and saving it as the existing record, then making a                                                          
         new SeasonStorage and setting its :storage_id to ‹"dummy value"› (read                                                        
         back as ‹"DUMMY VALUE"›) as well e its :epoch to a different value,                                                           
         ‹nil›, the matcher expected the new SeasonStorage to be invalid, but                                                          
         it was valid instead.

         As indicated in the message above, :storage_id seems to be changing                                                           
         certain values as they are set, and this could have something to do                                                           
         with why this test is failing. If you or something else has overridden                                                        
         the writer method for this attribute to normalize values by changing                                                          
         their case in any way (for instance, ensuring that the attribute is                                                           
         always downcased), then try adding `ignoring_case_sensitivity` onto                                                           
         the end of the uniqueness matcher. Otherwise, you may need to write                                                           
         the test yourself, or do something different altogether.

Вот строка Iне понимаю:

as well e its :epoch to a different value,                                                           
‹nil›, the matcher expected the new SeasonStorage to be invalid, but                                                          
it was valid instead

Ну, это не должно проверять: эпоха со значением nil, так как nil запрещен другой проверкой.

Чего мне здесь не хватает?Странно то, что это работает так, как и ожидалось, если я избегаю увеличения входных данных.

Здесь неясны две вещи:

  • В сообщении говорится, что используется то же значение "фиктивное значение"для двух записей, использующих разные области видимости, и что он должен быть недействительным, хотя я думаю, что он должен быть полностью действительным.
  • При использовании другой области видимости используется недопустимая (ноль не принимается), но сообщениеговорит, что сохраненная запись действительна.
...