Ruby on Rails プログラミング 日記投稿サービスを1から作る

【Rspec入門 #4】Rails6にてRspecでUserモデルのテストの書き方2

 

みやちゃ

 

皆さんこんにちは、みやちゃです!

物理とプログラミングについて解説しています!

今回はRspecでモデルのテストを書いていきます!

まだRspecをインストールしていない方はこちらの記事をご覧ください!

こちらの記事で、「テストをするアプリケーションの作成」から「簡単なテストの実行」まで解説しているので、ぜひそちらからご覧ください!

こちらの記事でもUserモデルのテストを解説しています!

今回は
  • メールアドレスカラムがなければ無効な状態である
  • 重複したメールアドレスは無効である
この記事を読むと

Userモデルのテストを書けるようになります!

テスト:メールアドレスカラムがなければ無効な状態である

前回の続きとして、早速テストを書いていきましょう。

今回のテストの内容は「メールアドレスカラムがなければ無効な状態である」です。

つまり、今回はUserモデルの作成に失敗するテストを書きます。

テストを書く上では、失敗するテストを書くのも重要になります。

spec/models/user_spec.rbファイルを開いて以下のように記述してください。

require 'rails_helper'

RSpec.describe User, type: :model do
  it "is valid with a email and password" do
    user = User.new(
      email: "user1@user.com",
      password: "user1pass",
    )
    expect(user).to be_valid
  end

  it "is invalid without an email" do
    user = User.new(
      email: nil,
      password: "user1pass",
    )
    user.valid?
    expect(user.errors[:email]).to include("can't be blank")
  end
end
it "テストの名前" do

  テストの内容(今回は、emailがnilの状態でUserを作成して、userという関数に代入している)
  
  expect(予期する結果)
end

テストの名前は、「is invalid without an email」で、「emailが無ければ、無効である」という意味です。

見ての通り、Userをnewする際に、emailをnilにしています。

そこで「user.valid?」とすることで、エラーが出るようにしています。

expectのところでは、エラーの内容が「can't be blank」を含んでいるという内容です。

初見でも何が書いてあるかよくわかると思います。

何をテストしているのかわかるように書くのも重要です。

テストの実行

それではテストを実行してみます。

ターミナルを開いて、以下のコマンドを実行してください。

rspec_sample miyacha$ bin/rspec spec/models/user_spec.rb

上記の結果

Running via Spring preloader in process 96076

User
  is valid with a email and password
  is invalid without an email

Finished in 0.09089 seconds (files took 0.6189 seconds to load)
2 examples, 0 failures

上記のような結果が返ってきました。

テストが通ったみたいですね。

つまり、emailが無ければ、ちゃんとエラーになってくれるということがわかりました。

重複したメールアドレスは無効な状態である

今回のテストの内容は「重複したメールアドレスは無効な状態である」です。

今回もUserモデルの作成に失敗するテストを書きます。

同じメールアドレスではUserは作成できないかどうかをテストします。

spec/models/user_spec.rbファイルを開いて以下のように記述してください。

require 'rails_helper'

RSpec.describe User, type: :model do
  it "is valid with a email and password" do
    user = User.create(
      email: "user1@user.com",
      password: "user1pass",
    )
    expect(user).to be_valid
  end

  it "is invalid without an email" do
    user = User.create(
      email: nil,
      password: "user1pass",
    )
    user.valid?
    expect(user.errors[:email]).to include("can't be blank")
  end

  it "is invalid with a duplicate email address" do
    User.create(
      email: "user1@user.com",
      password: "user1pass",
    )
    user = User.new(
      email: "user1@user.com",
      password: "user2pass",
    )
    user.valid?
    expect(user.errors[:email]).to include("has already been taken")
  end
end
it "テストの名前" do

  テストの内容(今回は、一度Userをcreateして、emailが同じユーザーをuserという関数に代入している)
  
  expect(予期する結果)
end

テストの名前は、「is invalid with a duplicate email address」で、「重複したemailは無効である」という意味です。

見ての通り、Userを最初にcreateしています。

そのあとに、同じemailのUserを作成してuserという関数に代入しています。

そこで「user.valid?」とすることで、エラーが出るようにしています。

expectのところでは、エラーの内容が「has already been taken」を含んでいるという内容です。

テストの実行

それではテストを実行してみます。

ターミナルを開いて、以下のコマンドを実行してください。

rspec_sample miyacha$ bin/rspec spec/models/user_spec.rb

上記の結果

Running via Spring preloader in process 96230

User
  is valid with a email and password
  is invalid without an email
  is invalid with a duplicate email address

Finished in 0.0798 seconds (files took 0.5832 seconds to load)
3 examples, 0 failures


上記のような結果が返ってきました。

テストが通ったみたいですね。

つまり、重複したemailではUserモデルは作成できないということがわかりました。

まとめ

いかがでしたでしょうか?

今回は、Userモデルのテストを書きました。

次回は、Postモデルのテストを書いていきます!

 

みやちゃ

 

ここまでご覧いただきありがとうございます!

こちら のUdemyの動画教材は、8時間で、

  • Dockerで仮想環境構築
  • Railsの基礎を解説しながら、アプリケーション開発
  • RSpecでテストを記述

まで解説しています。

Udemyの教材へ

Railsエンジニアとして働くために必要な、DockerとRSpecを同時に解説してくれています。

DockerとRSpecを使って作ったポートフォリオはかなり評価が高くなります。

ぜひ動画を見てみてはいかがでしょうか?

Udemyの教材へ

受講生は、5000人以上!です。

さらに、Udemyは、30日間の返金保証付きなので、いつでも返金できます。

たったの8時間でDocker、Rails、Rspecを学ぶ即戦力Railsエンジニア養成講座

© 2021 みやちゃのブログ Powered by AFFINGER5