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
endcontextやletを使うと、一目みたときに「このテストでなにを確認したいのか」すぐわかるようにできる
context(bofore)でテストを書く
「◯◯の状況である場合、●●が出来る」
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を使う
「タイトルと記事がある」という前提を実現させるため、ダミーデータを中に入れる
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
endarticleがbefore doの中に入ってしまい、expect(article).to be_validで使うことが出来ない
→ インスタンス変数@articleにしておく
contextを使うほうが、前提条件と、なにを確認したいのかが一目でわかりやすい
ターミナルを開いて、前回と同じように実行する
bundle exec rspec spec/models/article_spec.rbテスト成功!

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
endletを使うときは@(インスタンス変数)をつけなくても良い(:user)とは、user =と同じ意味letを使うとき、beforeは使わない
ターミナルを開いて、前回と同じように実行する
bundle exec rspec spec/models/article_spec.rbテスト成功!

#DAY13
