module ActiveModel::Lint::Tests
Тесты проверки Active Model
Проверить, соответствует ли объект API Active Model, можно, включив ActiveModel::Lint::Tests в свой TestCase. Будут запущены тесты, которые покажут, полностью ли ваш объект соответствует требованиям, а если нет — какие аспекты API не реализованы.
Обратите внимание: для работы с Action Pack объекту необязательно реализовывать все API. Этот модуль призван лишь дать рекомендации на случай, если вы хотите получить все возможности из коробки.
Эти тесты не пытаются определить семантическую корректность возвращаемых значений. Например, можно реализовать valid? так, чтобы он всегда возвращал true, и тесты пройдут. Вы сами должны убедиться, что значения имеют смысл с точки зрения семантики.
Ожидается, что переданные вами объекты при вызове to_model будут возвращать соответствующий требованиям объект. Вполне допустимо, чтобы to_model возвращал self.
Публичные методы экземпляра
# File activemodel/lib/active_model/lint.rb, line 102 def test_errors_aref assert_respond_to model, :errors assert_equal [], model.errors[:hello], "errors#[] should return an empty Array" end
Тест проходит, если модель объекта отвечает на errors и вызов [](attribute) для результата этого метода возвращает массив. В противном случае тест завершается неудачей.
errors[attribute] используется для получения ошибок модели для заданного атрибута. Если ошибки есть, метод должен возвращать массив строк с ошибками для соответствующего атрибута. Если используется локализация, строки должны быть локализованы для текущей локали. Если ошибок нет, метод должен возвращать пустой массив.
# File activemodel/lib/active_model/lint.rb, line 81 def test_model_naming assert_respond_to model.class, :model_name model_name = model.class.model_name assert_respond_to model_name, :to_str assert_respond_to model_name.human, :to_str assert_respond_to model_name.singular, :to_str assert_respond_to model_name.plural, :to_str assert_respond_to model, :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 70 def test_persisted? assert_respond_to model, :persisted? assert_boolean model.persisted?, "persisted?" end
Тест проходит, если модель объекта отвечает на persisted? и вызов этого метода возвращает true или false. В противном случае тест завершается неудачей.
persisted? используется при вычислении URL объекта. Если объект не сохранён, например, форма для этого объекта будет направлена на действие создания. Если объект сохранён, форма для него будет направлена на действие обновления.
# File activemodel/lib/active_model/lint.rb, line 31
def test_to_key
assert_respond_to model, :to_key
def_method(model, :persisted?) { false }
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 46
def test_to_param
assert_respond_to model, :to_param
def_method(model, :to_key) { [1] }
def_method(model, :persisted?) { false }
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 58 def test_to_partial_path assert_respond_to model, :to_partial_path assert_kind_of String, model.to_partial_path end
Тест проходит, если модель объекта отвечает на to_partial_path и вызов этого метода возвращает строку. В противном случае тест завершается неудачей.
to_partial_path используется для поиска шаблонов partial. Например, модель BlogPost может возвращать «blog_posts/blog_post».
© 2004–2021 David Heinemeier Hansson
Licensed under the MIT License.