はじめに
今回はRSpec内でテスト前の事前処理をまとめたいときに使用するbefore doについてまとめます
そもそも使ったことがない、1から知りたい場合は下記の記事を合わせて参照してください
今回のテストは 「ログイン処理があるwebページでログイン後の処理(マイページ確認など)をテストする」 ことを想定して記載します
何も考えずにテストを書くと…
request_spec.rb
describe 'マイページ確認' do
context 'ログインしている場合' do
it '「ログインID」の項目があること' do
post '/login_to_application' params:{id: 'test_user', password:'password'} # ログイン処理
get '/mypage'
expect(response.body).to include 'ログインID:'
end
it '「ニックネーム」の項目があること' do
post '/login_to_application' params:{id: 'test_user', password:'password'} # ログイン処理
get '/mypage'
expect(response.body).to include 'ニックネーム:'
end
it '「ひとこと」の項目があること' do
post '/login_to_application' params:{id: 'test_user', password:'password'} # ログイン処理
get '/mypage'
expect(response.body).to include 'ひとこと:'
end
end
context 'ログインしていない場合' do
it 'エラーページに遷移すること' do
get '/mypage'
expect(response.body).to include 'お探しのページは見つかりませんでした。'
end
end
end
"/login_to_application"というパスにユーザー名とパスワードを渡すとログインできると仮定して記載していますが、上記のようにテスト項目ごとに毎回ログイン処理を記載しないとテストが通りません。こんな時に役に立つのが共通化するためのbefore doです。
before do
request_spec.rb
describe 'マイページ確認' do
context 'ログインしている場合' do
before do
post '/login_to_application' params:{id: 'test_user', password:'password'} # ログイン処理
end
it '「ログインID」の項目があること' do
get '/mypage'
expect(response.body).to include 'ログインID:'
end
it '「ニックネーム」の項目があること' do
get '/mypage'
expect(response.body).to include 'ニックネーム:'
end
it '「ひとこと」の項目があること' do
get '/mypage'
expect(response.body).to include 'ひとこと:'
end
end
context 'ログインしていない場合' do
it 'エラーページに遷移すること' do
get '/mypage'
expect(response.body).to include 'お探しのページは見つかりませんでした。'
end
end
end
before do を用いることで上記のようにログイン処理をまとめることができます。
また、今回はログインしている場合としていない場合でテストを分けているため'ログインしている場合'のcontext内に書いてますが、describe直下に書くことで'ログインしていない場合'のcontextにも反映させることができます。
参考資料