В моей модели я динамически создаю несколько методов на основе записей базы данных:
class Job < ActiveRecord::Base
belongs_to :job_status
# Adds #requisition?, #open?, #paused?, #closed?
class_eval do
JobStatus.all.each do |status|
unless method_defined? "#{status.name.downcase}?"
define_method("#{status.name.downcase}?") do
job_status_id == status.id
end
end
end
end
end
class JobStatus < ActiveRecord::Base
has_many :jobs
end
Таблица job_statuses
содержит некоторые начальные данные, поэтому не будет часто меняться, но в случаеМне нужно добавить новые статусы, мне не нужно добавлять больше кода, чтобы получить логический метод для нового статуса.
Однако я не уверен, как тестировать эти методы, потому что когда rspec запускает job_statuses
таблица, очевидно, пуста, и когда создаются JobStatus
объекты, Job
инициализируется, но поскольку никаких объектов еще не существует, он не создает никаких методов, и мои тесты не выполняются, потому что методы не существуют.
Обратите внимание, что я использую rspec с spork & guard и использую очиститель базы данных со стратегией усечения (согласно Railscast # 257 , так как я использую Selenium), так что это, вероятно, усложняетвопросы.