Имея большой стек моделей и используя методы кэширования куклы широко, каждый заканчивается тем, что многие модели родительских моделей были «тронуты» после обновления модели.Как отключить параметр sort_to: touch в тестах Rspec для моделей Rails?
Во время тестирования это, кажется, время, когда вы пытаетесь проверить эту особенность.
Есть ли способ предотвратить модели touch
belongs_to
ассоциации для тестовой среды или на уровне тестирования?
UPDATE 1:
Моя первая попытка случае будет
# /config/initializers/extensions.rb
#
class ActiveRecord::Base
def self.without_touch_for_association(association_name, &block)
association_name = association_name.to_sym
association = self.reflect_on_all_associations(:belongs_to).select { |reflection| reflection.name == association_name }.first
options = association.options
association.instance_variable_set :@options, options.except(:touch)
yield
association.instance_variable_set :@options, options
end
end
Post.without_touch_for_association(:user) do
Post.last.save
end
Конечно, никакого успеха и сохранения Post.last
до сих пор трогает это User
.
ОБНОВЛЕНИЕ ОБОСНОВАНИЕ:
Я понимаю и согласен, что этот подход может быть источником ошибок, и это не очень хорошая практика вообще. Дело в том, что у меня огромный пакет с множеством интеграционных и модульных тестов. Кубическое кэширование также проникает в дерево моделей. Каждый раз, когда я смотрю журналы, я вижу существенные% запросов касательно. Я знаю, что лучшим способом было бы оптимизировать модульные тесты, чтобы добавить больше насмешек, ступлений и меньшей настойчивости. Решение проблемы в рамках интеграционных тестов сложнее.
В любом случае, я задаю этот вопрос ради изучения и исследований. Я заинтересован в изучении потенциальных улучшений скорости этой техники.
РЕШЕНИЕ: см. Мой собственный ответ ниже для рабочего кода.
Извините заранее, что не предлагает прямого решения. Тем не менее, я был бы очень осторожен в попытке этого в первую очередь, так как это значительно изменило бы поведение вашего приложения и стало бы богатым потенциальным источником ошибок, связанных с производством. Если вызовы '# touch' действительно вызывают значительное замедление в вашем тестовом наборе, кажется, что в первую очередь создается слишком много сохраняющихся записей. Вас интересуют прежде всего модульные тесты или интеграционные тесты? – SimonC
Спасибо SimonC! Я уточнил вопрос с моим обоснованием. Ура! – dgilperez
Ну, я не думаю, что это очень хорошее предложение, но нельзя использовать метод касания для любого экземпляра, например: 'User.any_instance.stub (: touch) .and_return (true)' поэтому он на самом деле ничего не делает? –