0
3

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.

[Rails][RSpec]導入と書き方 〜userモデル編〜

Last updated at Posted at 2020-07-15

これはなに

RailsでのRSpec導入とテストコードの記述方法です。
初学者が備忘録のため書いています。ご指摘等あれば頂けると幸いです。

では、いきましょう!

Gemをインストール

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


group :development do
gem 'web-console', '>= 3.3.0'
end
bundle install

RSpecの基本設定

ターミナル
#RSpec用設定ファイルの作成
rails g rspec:install

#4つのファイルが作成されます
create  .rspec
create  spec
create  spec/spec_helper.rb
create  spec/rails_helper.rb

.rspecに以下を追記します。

.rspec
--format documentation

RSpecを走らせるコマンドbundle exec rspecで動作確認。
まだなにもテストコード書いてないので、0 examples, 0 failuresと出ます。
これで動作確認完了です。

ターミナル
$ bundle exec rspec


No examples found.

Finished in 0.00031 seconds (files took 0.19956 seconds to load)
0 examples, 0 failures

ファイル作成

次に、必要なファイルを作ります。
specフォルダ下に以下のように作成。モデルのテストなのでモデルのフォルダを作成。

- app
- spec
    - models
        - user_spec.rb

次にfactory_botのフォルダとファイルを作成します。

- app
- spec
    - factories
        -users.rb 

これで必要なファイルは完成しました。

テストコード書き方

まず、factories/users.rbのファイルを以下のように編集。
とりあえず進みます。

factories/users.rb
FactoryBot.define do
  factory :user do
    name { "abc" }
    email { "aaa@bbb" }
    password              { "000000" }
    password_confirmation { "000000" }
  end
end
medels/user_spec.rb
require 'rails_helper'
describe User do
  describe '#create' do
    it "nameがない場合は登録できないこと" do
      user = build(:user, name: nil)
      user.valid?
      expect(user.errors[:name]).to include("を入力してください")
    end
  end
end
  • 一行目のrequire 'rails_helper'は、rails_helper.rb内の記述を読み込むこんでいます。この1行目の記述は、全ての~_specファイルに書くと思って頂いて大丈夫です。

  • 二行目のdescribe User do ~ endはUserモデルのテストであることを示しています。

  • 三行目のdescribe '#create' do ~ endはcreateメソッド(ユーザー新規登録)であることを示しています。

  • 四行目のit "nameがない場合は登録できないこと" do ~ endはテストの説明です。この間にテストコードを書いていきます。

  • user = build(:user, name: nil)
    こちらは、buildメソッドでfactories/users.rbのuserを作成しています。作成した際、nameだけ空にしたいので、nameカラムを指定し、nilにしています。

  • user.valid?
    こちらはbuildしたuserに対して、valid?でバリデーションにより保存ができない状態であるか」を確かめることができます。

  • expect(user.errors[:name]).to include("を入力してください")
    こちらは、valid?メソッドを利用したuserに対してerrorsメソッドを利用し、なぜバリデーションにより保存ができないのかを確認することができます。
    includeマッチャは引数にとった値が、expectの引数である配列に含まれているかをチェックするマッチャです。
    今回の場合、「nameがnilの場合は、を入力してください、というエラーが出るはずだ」ということがわかっているため、include("を入力してください")のように書くことができます。
    実際にその通りになれば、このコードは意図した動作をすると確認出来ます。

実際にテストを実行してみましょう。

ターミナル
$ bundle exec rspec

〜省略〜
1 example, 0 failures

特に赤文字エラーが出てなく、0 failuresとなっていれば成功です!

以上です!
ありがとうございました!

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?