Где поставить вспомогательные функции для задач рейка и тестовых файлов в Ruby on Rails?
В моем приложении Rails у меня есть файл sample_data.rb
внутри /lib/tasks
, а также куча тестовых файлов внутри моего каталога /spec
.
Все эти файлы часто имеют общую функциональность, например:
def random_address
[Faker::Address.street_address, Faker::Address.city].join("\n")
end
Где я должен помещать эти вспомогательные функции? Есть ли какое-то соглашение об этом?
Спасибо за любую помощь!
Ответы
Ответ 1
Вы можете создать статический класс со статическими функциями. Это будет выглядеть примерно так:
class HelperFunctions
def self.random_address
[Faker::Address.street_address, Faker::Address.city].join("\n")
end
def self.otherFunction
end
end
Затем все, что вам нужно сделать, это:
При этом убедитесь, что вы включили какие-либо зависимости в свой класс HelperFunctions
.
Ответ 2
Если вы уверены, что он имеет значение только для определенного типа, вы также можете добавить его непосредственно в RAILS_ROOT/Rakefile
(что, вероятно, не так для примера, который вы используете).
Я использую это для упрощения синтаксиса rake invoke:
#!/usr/bin/env rake
# Add your own tasks in files placed in lib/tasks ending in .rake,
# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
require File.expand_path('../config/application', __FILE__)
def invoke( task_name )
Rake::Task[ task_name ].invoke
end
MyApp::Application.load_tasks
Таким образом, я могу использовать invoke "my_namespace:my_task"
в rake-задачах вместо Rake::Task[ "my_namespace:my_task" ].invoke
.
Ответ 3
Вы делитесь методами в модуле и размещаете такой модуль внутри папки lib
.
Что-то вроде lib/fake_data.rb
, содержащее
module FakeData
def random_address
[Faker::Address.street_address, Faker::Address.city].join("\n")
end
module_function
end
и внутри вашей задачи рейка требуется только модуль, а вызов FakeData.random_address
.
Но, если это похоже на семя, которое вам нужно делать каждый раз, когда вы запускаете свои тесты, вы должны добавить это в свой общий before all
.
например. my spec_helper
выглядит следующим образом:
# Requires supporting ruby files with custom matchers and macros, etc,
# in spec/support/ and its subdirectories.
Dir[Rails.root.join("spec/support/**/*.rb")].each { |f| require f }
RSpec.configure do |config|
config.use_transactional_fixtures = true
config.infer_base_class_for_anonymous_controllers = false
config.order = "random"
include SetupSupport
config.before(:all) do
load_db_seed
end
end
а модуль SetupSupport
определяется в spec/support/setup_support.rb
и выглядит следующим образом:
module SetupSupport
def load_db_seed
load(File.join(Rails.root, 'db', 'seeds.rb'))
end
end
Не уверен, что вам нужно загрузить семена или уже делаете это, но это идеальное место для генерации необходимых поддельных данных.
Обратите внимание, что мой класс поддержки установки определен в spec/support
, потому что код относится только к моим спецификациям, у меня нет задачи рейка, также требующей того же кода.