はじめに
開発環境にダミーデータを入れてテストする際に、「SQLのINSERT文を実行!」などはせず、rakeを使ってコマンドラインからデータを作成するようにしてみましたので、記録として残します。
rakeタスクファイルの作成
※ 今回はuserのインスタンスを作成するケースで進めていきます。
rails g task task_user
rakeファイルの編集
task_user.rb
namespace :task_users do
desc "create user"
task :create_user, ["name", "email", "password"]=> :environment do |task, args|
user = User.new(
name: args[:name],
email: args[:email],
password: args[:password]
)
user.save!
end
RSpecでテストを書く
※説明上rakeファイルの編集から記載してありますが、実際にコードを書いていく際はテストから書いた方がいいです。
task_users_spec.rb
require 'rails_helper'
require 'rake'
describe "TaskUsers" do
before(:all) do
@rake = Rake::Application.new
Rake.application = @rake
Rake.application.rake_require 'tasks/task_users' #specディレクトリ内の/lib以下のパスを指定します
Rake::Task.define_task(:environment)
end
before(:each) do
@rake[task_name].reenable
end
context "create user" do
let(:task_name) { 'task_user:create_user' }
let(:name) { "kantai" }
let(:email) { "hogehoge@.hoge.jp" }
let(:password) { Faker::Alphanumeric.alphanumeric(number: 10) } # ランダムな数列を作成しています
# matcherは、「Userのレコードが1増えているかどうか」という条件で設定しています。
it "created user" do
expect{ @rake[:task_name].invoke(name, email, password).to change(User, :count).by(1)
end
end
コマンドで実行
rake 'task_users:create_user[name,email,password]'
おわりに
なかなかrakeを使ってコマンドからレコードを作成するケースは少ないかと思いますが、チームでドキュメントとして残しておくことで、レコード作成を属人化することなく誰でも作成しやすくできるのが良い点かなと思います。