Где поставить вспомогательные функции для задач рейка и тестовых файлов в 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::random_address(anyParametersYouMightHave)
    

При этом убедитесь, что вы включили какие-либо зависимости в свой класс 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, потому что код относится только к моим спецификациям, у меня нет задачи рейка, также требующей того же кода.