WEB系プログラミングに関する雑記ブログ

このブログは、主にWEB系の話(プログラミング、IT系のニュースなど)をします。

Rspec 単体テストの導入

Railsアプリでの単体テストとして、Rspecを導入しましたので、 導入方法および簡単なテストの記述について説明したいと思います。

gemを追加します。

まずは、

Gemfile

group :development, :test do

~省略~
  gem 'rspec-rails'
end


group :development do
  gem 'web-console'
end

gemfileをインストールしたら、 bundle installをします。

その後に、Rspecの基本設定をします。

ターミナルから、以下のコマンドを入力してください。

ターミナル

rails g rspec:install


すると、以下のファイルが作成されます。

      create  .rspec
      create  spec
      create  spec/spec_helper.rb
      create  spec/rails_helper.rb


rails_helper.rbというのは、 Rspecを利用する際に、共通の設定を書いておくファイルのことです。


今回は、ユーザー新規登録のテストを書いてみます。


spec/models/user_spec.rbを作成します。

そして、基本となるコードを書いてみます。


require 'rails_helper'
describe User do
  describe '#create' do
    it "is invalid without a name" do
    end
  end
end


上記の記述について、説明します。

describe do

end

というのは、

期待する結果をまとめて記述(describe)しています。 このケースでは User モデルがどんなモデル なのか、 どんな振る舞いをするのかということを説明しています。


it ~ do

end

のところで、実際に動作するテストコードのまとまりを記述します。


上記の例では、

「名前の入力がないと登録ができない」ということを確認したいため、

it "is invalid without a name" do

end

と記述しています。


それでは実際に、テストを記述してみます。

     user = User.new(name: "", email: "test@gmail.com", password: "123456", password_confirmation: "123456")
     user.valid?
     expect(user.errors[:nickname]).to include("can't be blank")


1行目の

user = User.new(name: "", email: "test@gmail.com", password: "123456", password_confirmation: "123456")

のところで、userクラスのインスタンスを作成しています。


2行目の

user.valid?

で作成されたインスタンスが、

userクラスのバリデーションに引っかかっているかどうかを確認しています。


valid?メソッドの返り値は、 true、falseですが、falseが返り値の場合、 errorsメソッドを使うことで、エラーの原因を確認することができます。


3行目の expect(user.errors[:name]).to include("can't be blank")

というのは、 インスタンスが持つエラー文が期待したものとなっているかどうかを確認しています。


expectというのは期待するという意味、 includeというのは含むという意味です。

そのため、3行目は

「userインスタンスのnameカラムに関するエラー文には、can't be blankという言葉が含まれる。」

ということを確認しています。


それでは、今日はこのあたりで、、、

また、別の記事でfactory_botを使った単体テストについて書きたいと思います。