【rails】model spec(context・let)
contextとletを使って、それぞれテストを書く
前回の続きで、↓を書き換えていく
RSpec.describe Article, type: :model do
it 'タイトルと内容が入力されていれば、記事を保存できる' do
user = User.create!({
email: 'test@example.com',
password: 'password'
})
article = user.articles.build({
title: Faker::Lorem.characters(number: 10),
content: Faker::Lorem.characters(number: 300)
})
expect(article).to be_valid
end
end
contextやletを使うと、一目みたときに「このテストでなにを確認したいのか」すぐわかるようにできる
context(bofore)でテストを書く
context 前提条件を書く
「◯◯の状況である場合、●●が出来る」
it 'タイトルと内容が入力されていれば、記事を保存できる' do
↑のような前提条件を作るときにcontextを使う
RSpec.describe Article, type: :model do
context 'タイトルと内容が入力されている場合' do
end
「タイトルと記事がある場合」が前提条件になる
contextでは「〜場合」と書く
そして、it以降のコードをすべて中に入れる
RSpec.describe Article, type: :model do
context 'タイトルと内容が入力されている場合' do
it '記事を保存できる' do
user = User.create!({
email: 'test@example.com',
password: 'password'
})
article = user.articles.build({
title: Faker::Lorem.characters(number: 10),
content: Faker::Lorem.characters(number: 300)
})
expect(article).to be_valid
end
end
end
before 前提条件を成立させる要素を書く
前提条件を実現させるためのbeforeを使う
「タイトルと記事がある」という前提を実現させるため、ダミーデータを中に入れる
RSpec.describe Article, type: :model do
context 'タイトルと内容が入力されている場合' do
before do
user = User.create!({
email: 'test@example.com',
password: 'password'
})
@article = user.articles.build({
title: Faker::Lorem.characters(number: 10),
content: Faker::Lorem.characters(number: 300)
})
end
it '記事を保存できる' do
expect(@article).to be_valid
end
end
end
articleがbefore doの中に入ってしまい、expect(article).to be_validで使うことが出来ない
→ インスタンス変数@articleにしておく
contextを使うほうが、前提条件と、なにを確認したいのかが一目でわかりやすい
テストを実行してみる
ターミナルを開いて、前回と同じように実行する
bundle exec rspec spec/models/article_spec.rb
テスト成功!

letでテストを書く
let 変数を宣言する
rspecでは変数を宣言するときにletを使い、前提条件を作るときもletが使える
RSpec.describe Article, type: :model do
context 'タイトルと内容が入力されている場合' do
let!(:user) do
user = User.create!({
email: 'test@example.com',
password: 'password'
})
end
let!(:article) do
article = user.articles.build({
title: Faker::Lorem.characters(number: 10),
content: Faker::Lorem.characters(number: 300)
})
end
it '記事を保存できる' do
expect(article).to be_valid
end
end
end
letを使うときは@(インスタンス変数)をつけなくても良い(:user)とは、user =と同じ意味letを使うとき、beforeは使わない
テストを実行してみる
ターミナルを開いて、前回と同じように実行する
bundle exec rspec spec/models/article_spec.rb
テスト成功!

#DAY13