結合テストのコードを書けるようになる
使えるRSpec入門・その4「どんなブラウザ操作も自由自在!逆引きCapybara大辞典」
Ruby on Rails チュートリアル:実例を使って Rails を学ぼう
結合テスト(フィーチャーテスト)の書き方
以下二つのテストを書いていきます。
・Blogの新規作成画面でtitleを入力しないでサブミットしてエラーが出ることを確認
・Blogの新規作成画面でtitleを入力してサブミットしてデータ登録後、観覧画面に遷移することの確認
spec/features/blogs_spec.rb
require 'rails_helper'
feature 'Blog管理' do
scenario 'Blogの新規作成時にtitleを入力なかった場合にエラーが表示されること' do
visit blogs_path
click_link 'New Blog'
fill_in 'Title', with: ''
expect {
click_button 'Create Blog'
}.to change(Blog, :count).by(0)
expect(page).to have_content 'Titleを入力してください。'
end
scenario 'Blogの新規作成時にtitleを入力した場合はデータが保存され観覧画面に遷移すること' do
visit blogs_path
click_link 'New Blog'
fill_in 'Title', with: 'title'
expect {
click_button 'Create Blog'
}.to change(Blog, :count).by(1)
@blog = Blog.last
expect(current_path).to eq blog_path(@blog)
expect(page).to have_content 'Blog was successfully created.'
end
end
これに伴っていくつか機能拡張(TDDっぽい)
作成後に成功、失敗と表示を出すのをやり忘れていたため
2通りのやり方で作った。
まずはエラーのほう
<%= render 'shared/error_messages' %>
app/views/shared/_error_messages
<% if @blog.errors.any? %>
<div class = "alert alert-danger">
Titleを入力してください。
</div>
<% end %>
まぁこんな感じだけどこれはなんだかんだ消した。
app/controllers/blogs_controller.rb
def create
@blog = Blog.new(blog_params)
if @blog.save
flash[:success] = "Blog was successfully created."
redirect_to blog_path(@blog)
else
flash.now[:alert] = "Titleを入力してください。"
render 'new'
end
end
app/views/layouts/application.html
<body>
<% flash.each do |message_type, message| %>
<div class="alert alert-<%= message_type %>"><%= message %></div>
<% end %>
<%= yield %>
</body>