環境
MacOS Big Sur11.5.2
ruby 3.0.2
rails 6.1.4
docker 20.10.6
Gemのインストール
まずは Gemfile にrspec-rails
とrspec_junit_formatter
を追加します。
本番環境では RSpec を使わないので、開発とテスト環境にのみ gem をインストールさせます。
group :development, :test do
gem 'rspec-rails' # 追加
gem 'rspec_junit_formatter' # 追加
end
そしてdocker-compose run web bundle installとdocker-compose buildをします。
Rspecの基本設定
以下のコマンドでRspecをインストールします。
$ docker-compose run web rails g rspec:install
Rspecの実行
この段階ではまだ何もテストは書いていませんが、動作確認の意味で RSpec を実行してみます。
$ docker-compose run web rails spec
Starting rails-scaffold-circleci_webpacker_1 ... done
Creating rails-scaffold-circleci_app_run ... done
No examples found.
Finished in 0.00124 seconds (files took 0.38309 seconds to load)
0 examples, 0 failures
まだ何もテストを書いていないので当然テスト(exmaple) は 0、失敗(failure)も 0 ですが
とりあえず RSpec が動作していることは確認できました。
テスト用 model 生成
最低限のテストを行うため、適当に User モデルだけ作成しておきます。
string型の name, email カラムを用意しておきましょう。
$ docker-compose run web rails g model User name:string email:string
上記コマンドに以下のマイグレーションファイルが自動されます。
class CreateUsers < ActiveRecord::Migration[5.2]
def change
create_table :users do |t|
t.string :name
t.string :email
t.timestamps
end
end
end
自動生成されたマイグレーションファイルをもとに、マイグレーションを行います。
$ docker-compose run web rails db:migrate
これで、name カラムと email カラムを持った User モデルが作成されました。
次は User モデルに対するテストを RSpec で書いてみます。
Userモデルのテスト用RSpecファイルを生成
rspec-rails を入れているので、テスト用のファイルは rails g コマンドで生成できます。
$ docker-compose run web rails g rspec:model User
require 'rails_helper'
RSpec.describe User, type: :model do
pending "add some examples to (or delete) #{__FILE__}"
end
これを書き換えていきましょう。
今回はとりあえずテストが出来ればよいので、適当な name と email を持ったユーザーを登録できることを確認します。
↓
#####修正後
require 'rails_helper'
RSpec.describe User, type: :model do
it "name と email を持ったユーザーを登録できること" do
user = User.new(
name: "John",
email: "john@example.com",
)
# オブジェクトをexpectに渡す動作が有効であることを確認
expect(user).to be_valid
end
end
これで RSpec を実行してみましょう。
$ docker-compose run web rails spec
失敗 (failure) は無く成功していることを確認します。
Finished in 0.10029 seconds (files took 8.17 seconds to load)
1 example, 0 failures
これでテストが実行できることを確認しました。
参考