модуль ActiveModel::Lint::Tests
Тесты Active Model Lint
Вы можете проверить, соответствует ли объект API Active Model, включив ActiveModel::Lint::Tests в свой TestCase. Он включит тесты, которые покажут, соответствует ли ваш объект полностью API, или какие аспекты API не реализованы.
Обратите внимание, что объект не обязан реализовывать все API для работы с Action Pack. Этот модуль предназначен только для предоставления рекомендаций, если вы хотите все функции "из коробки".
Эти тесты не пытаются определить семантическую корректность возвращаемых значений. Например, вы можете реализовать valid? для всегда возвращения true, и тесты пройдут. Вам нужно убедиться, что значения семантически осмысленны.
Ожидается, что объекты, которые вы передаете, вернут совместимый объект после вызова to_model. Совершенно нормально, если to_model вернет self.
Общедоступные методы экземпляров
# File activemodel/lib/active_model/lint.rb, line 100 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
Проходит, если модель объекта отвечает на errors и если вызов [](attribute) на результате этого метода возвращает массив. В противном случае не проходит.
errors[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_name как метод экземпляра, так и как метод класса, и если вызов этого метода возвращает строку с некоторыми удобными методами: :human, :singular и :plural.
См. ActiveModel::Naming для получения дополнительной информации.
# File activemodel/lib/active_model/lint.rb, line 68 def test_persisted? assert model.respond_to?(:persisted?), "The model should respond to persisted?" assert_boolean model.persisted?, "persisted?" end
Проходит, если модель объекта отвечает на persisted? и если вызов этого метода возвращает либо true, либо false. В противном случае не проходит.
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 когда объект не сохранен. В противном случае не проходит.
to_key возвращает Enumerable всех (первичных) атрибутов ключей модели и используется для генерации уникального идентификатора DOM для объекта.
# File activemodel/lib/active_model/lint.rb, line 44 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 и если вызов этого метода возвращает nil когда объект не сохранен. В противном случае не проходит.
to_param используется для представления ключа объекта в URL. Реализаторы могут решить либо выбросить исключение, либо предоставить значение по умолчанию в случае, если запись использует составной первичный ключ. В lint нет тестов для этого поведения, поскольку нет смысла навязывать реализатору любую из возможных стратегий реализации.
# File activemodel/lib/active_model/lint.rb, line 56 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 и если вызов этого метода возвращает строку. В противном случае не проходит.
to_partial_path используется для поиска частичных представлений. Например, модель BlogPost может вернуть «blog_posts/blog_post».
© 2004–2018 David Heinemeier Hansson
Licensed under the MIT License.