結合テストのコードを書けるようになる

使えるRSpec入門・その4「どんなブラウザ操作も自由自在!逆引きCapybara大辞典」

noticeやalertの設定方法の違い

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>