module ActiveModel::Lint::Tests
Тесты Active Model Lint
Вы можете проверить, соответствует ли объект API Active Model, включив ActiveModel::Lint::Tests в свой TestCase. Он включит тесты, которые покажут, полностью ли ваш объект соответствует API или какие аспекты API не реализованы.
Обратите внимание, что для работы с Action Pack объекту не обязательно реализовывать все API. Этот модуль предназначен только для предоставления руководства в случае, если вы хотите все функции из коробки.
Эти тесты не пытаются определить семантическую корректность возвращаемых значений. Например, вы можете реализовать valid? для всегда возвращения true, и тесты пройдут. Вам необходимо убедиться, что значения имеют семантический смысл.
Ожидается, что объекты, которые вы передаёте, вернут совместимый объект в результате вызова to_model. Совершенно нормально, если to_model вернёт self.
Публичные методы экземпляра
# File activemodel/lib/active_model/lint.rb, line 97 def test_errors_aref assert model.respond_to?(:errors), "The model should respond to errors" assert model.errors[:hello].is_a?(Array), "errors#[] should return an Array" end
Тестирование ошибок
Возвращает объект, который реализует [](attribute), который возвращает массив строк — ошибки для заданного атрибута. Если используется локализация, строки должны быть локализованы для текущей локали. Если ошибки нет, этот метод должен возвращать пустой массив.
# File activemodel/lib/active_model/lint.rb, line 79 def test_model_naming assert model.class.respond_to?(:model_name), "The model class should respond to model_name" model_name = model.class.model_name assert model_name.respond_to?(:to_str) assert model_name.human.respond_to?(:to_str) assert model_name.singular.respond_to?(:to_str) assert model_name.plural.respond_to?(:to_str) assert model.respond_to?(:model_name), "The model instance should respond to model_name" assert_equal model.model_name, model.class.model_name end
Именование
Model.model_name и Model#model_name должны возвращать строку с удобными методами: # :human, :singular и :plural. См. ActiveModel::Naming для получения дополнительной информации.
# File activemodel/lib/active_model/lint.rb, line 69 def test_persisted? assert model.respond_to?(:persisted?), "The model should respond to persisted?" assert_boolean model.persisted?, "persisted?" end
Реагирует на persisted?
Возвращает логическое значение, указывающее, был ли объект уже сохранён. Это используется при расчёте URL для объекта. Если объект не сохранён, форма для этого объекта, например, будет перенаправлена на действие создания. Если объект сохранён, форма для объекта будет перенаправлена на действие обновления.
# File activemodel/lib/active_model/lint.rb, line 29 def test_to_key assert model.respond_to?(:to_key), "The model should respond to to_key" def model.persisted?() false end assert model.to_key.nil?, "to_key should return nil when `persisted?` returns false" end
Реагирует на to_key
Возвращает перечислимый объект всех (первичных) атрибутов ключа или nil, если model.persisted? ложно. Это используется dom_id для генерации уникальных идентификаторов для объекта.
# File activemodel/lib/active_model/lint.rb, line 46 def test_to_param assert model.respond_to?(:to_param), "The model should respond to to_param" def model.to_key() [1] end def model.persisted?() false end assert model.to_param.nil?, "to_param should return nil when `persisted?` returns false" end
Реагирует на to_param
Возвращает строку, представляющую ключ объекта, пригодную для использования в URL или nil если model.persisted? имеет значение false.
Реализаторы могут решить либо поднять исключение, либо предоставить значение по умолчанию в случае, если запись использует составной первичный ключ. В тесте lint нет тестов для этого поведения, потому что нет смысла навязывать какие-либо возможные стратегии реализации реализатору. Однако, если ресурс не сохранён (not persisted?), то to_param всегда должно возвращать nil.
# File activemodel/lib/active_model/lint.rb, line 57 def test_to_partial_path assert model.respond_to?(:to_partial_path), "The model should respond to to_partial_path" assert_kind_of String, model.to_partial_path end
Реагирует на to_partial_path
Возвращает строку, представляющую относительный путь. Это используется для поиска частичных шаблонов. Например, модель BlogPost может возвращать “blog_posts/blog_post”.
© 2004–2018 David Heinemeier Hansson
Licensed under the MIT License.