3
1

More than 3 years have passed since last update.

RSpecを導入して単体テストコードを記述する

Posted at

概要

今回は、userモデルの単体テストコードをrspecを導入して記述する流れをまとめます。

それに伴い、FactoryBotとFakerも導入して実装したので記述します。

FactoryBotとは

テスト用のデータを作成してくれるツールです。

Fakerとは

FactoryBotで作られたデータにランダムに中身を追加することが出来ます。

gemの導入、準備

ポイントとして、Gemfileの記述場所に注意しましょう。
一番下ではありません。

gemfile
group :development, :test do
  gem 'rspec-rails'
  gem 'factory_bot_rails'
  gem 'faker'
end

このあと
$ bundle install
します。

次に、コマンドを実行して、RSpecを書くためのディレクトリなどの生成を行います。

ターミナル
rails g rspec:install

すると、ディレクトリやファイルが生成されるはずです。

次に、.rspecに以下の記述をしましょう。

.rspec
--require spec_helper
--format documentation

最後に、FactoryBotのファイルを生成しましょう。
specディレクトリのなかにfactoriesディレクトリを自作し、今回はusers.rbを作成します。

これで下準備はOKです。

FactoryBotでの値を指定

先ほど作成したファイルにそれぞれ値を定義していきましょう。

spec/factories/users.rb
FactoryBot.define do
  factory :user do
    nickname {Faker::Name.last_name}
    email {Faker::Internet.free_email}
    password = Faker::Internet.password(min_length: 6)
    password {password}
    password_confirmation {password}
    family_name { "山田" }
    first_name {"太郎"}
    read_family {"ヤマダ"}
    read_first {"タロウ"}
    birth {Faker::Date.between(from: '1930-01-01', to: '2015-12-31')}
  end
end

ここでのポイントは、Fakerを利用しているところと、利用できないところがあることです。
Fakerは英数字しかランダムに生成できません。
よって、family_nameなどは今回は適当に値をつけときました。

日本語のダミーデータを作れるgemもあるようですが、今回は見送りました。

テストコードの記述

まずは準備として、テストコードを書いていくファイルをコマンドで生成します。

ターミナル
rails g rspec:model user

すると、
spec/models/user_spec.rb
が生成します。

そこに単体テストコードを書いていきましょう。

user_spec.rb
require 'rails_helper'

RSpec.describe User, type: :model do
  describe '#create' do
    before do
      @user = FactoryBot.build(:user)
    end

    it "nicknameが空だと登録できない" do
      @user.nickname = nil
      @user.valid?
      expect(@user.errors.full_messages).to include("Nickname can't be blank")
    end
    it "emailが空だと登録できない" do
      @user.email = nil
      @user.valid?
      expect(@user.errors.full_messages).to include("Email can't be blank")
    end
    it "emailに一意性がないと登録できない" do
      @user.save
      another_user = FactoryBot.build(:user, email: @user.email)
      another_user.valid?
      expect(another_user.errors.full_messages).to include("Email has already been taken")
    end
---省略---
 end
end

長いのでかなり省略しましたが、こんな感じで記述していきます。

ポイントは、
before doでちゃんとFactoryBotのデータをインスタンス変数で定義することです。
これを忘れて@userがnilになり、一回迷子になってしまいました(ド素人)

しっかり記述できたらターミナルで

ターミナル
bundle exec rspec spec/models/user_spec.rb

コマンドを入力してテストを実行してみましょう。

3
1
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
3
1