Windows10+WSL2でEveryday Rails – RSpecによるRailsテスト入門(Rails7.0版)を写経してみる(3)モデルスペック
Everyday Rails – RSpecによるRailsテスト入門(2022年版 23USドル)を写経してみる第3回。やっと、rspecのコードを書くことになりそうです。今回は、以下の続きです。
Windows10+WSL2でEveryday Rails – RSpecによるRailsテスト入門(Rails 7.0)を写経してみる 目次
開発環境
Windows 10 Pro 21H1
Hyper-Vを有効化
VisualStudioCode (wsl用の拡張機能インストール済み)
WSL2 Ubuntu 20.04 LTS
rbenv
ruby 3.1
nvm
node.js LTS最新版
yarn
sqlite3
google-chrome-stable
モデルスペックを作成する
ターミナルでrails g rspecコマンドで、モデルスペックファイルを作成します
bin/rails g rspec:model user
spec/models/user_spec.rb ファイルが作成されました。次に、テストを実行します。
bundle exec rspec
結構待ちます。30秒くらいでしょうか。rspecは条件によっては遅いとどこかで見たような気がしますが、今のところ、Minitestと比べてかなり時間がかかる印象です。
次に、がんばって、spec/models/user_rspec.rbの下の方を以下のように書き換えます。
RSpec.describe User, type: :model do
# 姓、名、メール、パスワードがあれば有効な状態であること
it "is valid with a first name, last name, email, and password"
# 名が無ければ無効な状態であること
it "is invalid without a first name"
# 姓が無ければ無効な状態であること
it "is invalid without a last name"
# メールアドレスが無ければ無効な状態であること
it "is invalid without a email address"
# 重複したメールアドレスなら無効状態であること
it "is invalid with a duplicate email address"
# ユーザーのフルネームを文字列として返すこと
it "returns a user's full name as a string"
end
この状態でテストを実行
bundle exec rspec
6個のテストがpendingとなりました。これから、テストのコードを書いていきます。
RSpecの構文
以下のような構文だそうです。
expect()メソッド
を用いるとのことです。
# 2と1を加えると3になること
it "adds 2 and 1 to make 3" do
expect(2 + 1).to eq 3
end
今回は、spec/models/user_spec.rb の最初のテストコードの部分を以下に書き換えます。
be_valid の部分を、
マッチャ
と呼ぶそうです。変な名前ですね。
# 姓、名、メール、パスワードがあれば有効な状態であること
it "is valid with a first name, last name, email, and password" do
user = User.new(
first_name: "Aaron",
last_name: "Summer",
email: "tester@example.com",
password: "dottle-nouveau-pavilion-tights-furze",
)
expect(user).to be_valid
end
(変更前)
(変更後)
テストの実行
bundle exec rspec
これで最初のテストがpass(GREEN)して、ほっと一息です。RSpecのHelloWorldまでにずいぶん時間がかかりました。。。
次に、2個目のテストコードを書いていきます。ひたすら、 Everyday Rails – RSpecによるRailsテスト入門第3章を写経してきます。
bundle exec rspec
テストが2つパス(GREEN)しました。
テストがfailするように、以下のように、to を to_not に変更してから、テストを実行(bundle exec rspec)してます。
予想通り、testがfailしました。
今度は、先ほどのto_not を to に戻したのち、app/models/user.rb を以下のように変更します。(first_nameのvalidationをコメントアウト)
bundle exec rspec
このコメントアウトは戻しておきます。
どんどん、テストを写経していきます。
bundle exec rspec
すると、1個failしました。
include()の中身を打ち間違えて、スペースを入れ忘れていました。ここを訂正して、もう一度bundle exec rspecすると、以下のよう、ちゃんと5個passしています。
疲れたので、続きはまた今度、、、
作成中
ディスカッション
コメント一覧
まだ、コメントがありません