0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

RakeタスクのテストをRSpecで書く

Last updated at Posted at 2021-03-05

はじめに

開発環境にダミーデータを入れてテストする際に、「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を使ってコマンドからレコードを作成するケースは少ないかと思いますが、チームでドキュメントとして残しておくことで、レコード作成を属人化することなく誰でも作成しやすくできるのが良い点かなと思います。

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?