SlideShare a Scribd company logo
Controller Specs
Xander Miller
@pareidoliax
What is Controller
Testing?
Why Controller Test?
Tools
RSpec
FactoryGirl
General RSpec Tips
RSpec Tips
• Configuration: Color, Verbose
• Alias bundle exec
• description text should build the user story
• add comments to your end statements
Configuration
~/.rspec
--require spec_helper
--color
--format documentation
bundle install --no-rdoc
Alias Bundle exec
alias brspec="bundle exec rspec"
alias be="bundle exec"
Description Text builds a User
Story
TagsController
when authorized User (admin)
the DELETE #destroy action
behaves like a 302 redirect request action
redirects to :back (root_path)
RSpec Gotchas
RSPec Gotchas
• Scoping is weird
it_behaves_like "a 302 redirect request action", ":back (root_path)" do
let!(:put_update) {put :update, id: @user.id, user: @user_attributes}
let(:redirect_path) {root_path}
end
• Relish Docs
How to RSpec
How to RSpec
OO BB Object Oriented Black Box
• Given (Context)
• When (Event)
• Then (Expected Result)
Applying it to
Controllers
Given
• Session
• Domain Object Layer status
• Params
When
• HTTP Request with Params
Then
• Flash Messages
• Assigns Instance Variables (decorators)
• Domain Object Layer Changes
Keeping it DRY
• before Hooks (given)
• let (when)
• shared examples
before :example
before :example do
@admin = create(:admin)
session[:user_id] = @admin.id
end
let :example
let!(:post_create) {post :create, user: @user_attributes}
let(:redirect_path) {root_path}
shared examples: 3 types of
RESTful responses
• successful GET action
• redirect 302 action
• unauthorized action 302 redirect
successful GET action
RSpec.shared_examples_for 'an unauthorized action' do
it "responds redirect with an HTTP 302 status code" do
expect(response).to be_redirect
expect(response).to have_http_status(:found)
end
it "provides a flash alert message" do
expect(flash[:warning]).to_not be_nil
end
it "redirects to login_path" do
expect(response).to redirect_to login_path
end
end
redirect 302 action
RSpec.shared_examples_for "a 302 redirect request action" do |path_name|
it "responds with a redirect HTTP 302 status code" do
expect(response).to be_redirect
expect(response).to have_http_status(:found)
end
it "redirects to #{path_name}" do
expect(response).to redirect_to redirect_path
end
end
unauthorized action 302 redirect
RSpec.shared_examples_for 'an unauthorized action' do
it "responds redirect with an HTTP 302 status code" do
expect(response).to be_redirect
expect(response).to have_http_status(:found)
end
it "provides a flash alert message" do
expect(flash[:warning]).to_not be_nil
end
it "redirects to login_path" do
expect(response).to redirect_to login_path
end
end
Overall Structure of a
Controller Spec
require 'support/controller_helper'
describe UsersController do
context 'when unauthorized (no User)' do
describe "the GET #new action" do
end # describe "the GET #new action" do
describe "the POST #create action" do
context "is provided valid User params and" do
end # context "is provided valid User params and" do
context "is provided invalid User params and" do
end # context "is provided invalid User params and" do
end # describe "the POST #create action" do
describe "the GET #show action" do
end # describe "the GET #show action" do
end # context 'when unauthorized (no User signed in)' do
context 'when authorized (Admin User)' do
describe "the GET #index action" do
end #describe "the GET #index action" do
describe "the PUT #update action" do
context "is provided valid user params and" do
end # "is provided valid user params and" do
context "is provided invalid user params and" do
end # "is provided invalid user params and" do
end # "the PUT #update action" do
end # context 'when authorized (Admin User)' do
end
Example Specs
Unauthorized Action
describe "the GET #show action" do
before :example do
@user = create(:user)
end
it_behaves_like 'an unauthorized action' do
let!(:get_show) {get :show, {id: @user.id}}
end
end # describe "the GET #show action" do
Examples by RESTful
Action
GET #show
describe "the GET #show action" do
before :example do
@user = create(:user)
end
it_behaves_like "a successful GET action", :show do
let!(:get_show) {get :show, {id: @user.id}}
end
let(:get_show) {get :show, {id: @user.id}}
it "assigns a valid UserDecorator of to @user" do
get_show
@decorated_user = UserDecorator.new @user
expect(assigns(:user)).to be_kind_of(UserDecorator)
expect(assigns(:user)).to eq(@decorated_user)
end
end # describe "the GET #show action" do
GET #index
describe "the GET #index action" do
it_behaves_like "a successful GET action", :index do
let!(:get_index) {get :index}
end
let(:get_index) {get :index}
GET #index con'd
it "loads the users in the current users, current region" do
region = create(:region)
user1, user2 = create(:user), create(:user)
[@admin, user1, user2].each do |u|
u.add_to_region! region
u.current_region = region
u.save
end
get_index
expect(assigns(:users)).to
match_array([@admin.reload, user1.reload, user2.reload])
end
end #describe "the GET #index action" do
GET #new
describe "the GET #new action" do
it_behaves_like "a successful GET action", :new do
let!(:get_new) {get :new}
end
let!(:get_new) {get :new}
it "assigns a unsaved User to @user" do
expect(assigns(:user)).to be_kind_of(User)
expect(assigns(:user)).to respond_to(:id).with(nil)
end
end # describe "the GET #new action" do
POST #create
describe "the POST #create action" do
before :example do
@user_attributes = attributes_for(:user)
request.env["HTTP_REFERER"] = root_path
end
let(:post_create) {post :create, user: @user_attributes}
POST #create con't
context "is provided valid User params and" do
it_behaves_like "a 302 redirect request action", ':back (to root_path)' do
let!(:post_create) {post :create, user: @user_attributes}
let(:redirect_path) {root_path}
end
it "creates a user" do
expect { post_create }.to change(User, :count).by(1)
end
it "provides a flash success message" do
post_create
expect(flash[:success]).to_not be_nil
end
end # context "is provided valid User params and" do
POST #create con't con't
context "is provided invalid User params and" do
before :example do
@user_attributes = attributes_for(:user)
User.create @user_attributes
end
it_behaves_like "a 302 redirect request action", 'new_user_path' do
let!(:post_create) {post :create, user: @user_attributes}
let(:redirect_path) {new_user_path}
end
it "fails to create a new user" do
expect { post :create, user: @user_attributes }.not_to change(User, :count)
end
it "provides a flash danger message" do
post_create
expect(flash[:danger]).to_not be_nil
end
end # context "is provided invalid User params and" do
end # describe "the POST #create action" do
GET #edit
describe "the GET #edit action" do
before :example do
@user = create(:user)
end
it_behaves_like "a successful GET action", :edit do
let!(:get_edit) {get :edit, {id: @user.id}}
end
let(:get_edit) {get :edit, {id: @user.id}}
it "loads all of the roles from User class into @roles" do
roler = class_double("User")
allow(roler).to receive(:roles).and_return([:worker, :manager, :organizer, :moderator, :admin])
get_edit
expect(assigns(:roles)).to match_array([:worker, :manager, :organizer, :moderator, :admin])
end
GET #edit c
on't
it "loads all of the regions from Region class into @regions" do
region1, region2 = create(:region), create(:region)
get_edit
expect(assigns(:regions)).to match_array([region1, region2])
end
it "assigns valid UserDecorator to @user" do
get_edit
@decorated_user = UserDecorator.new @user
expect(assigns(:user)).to be_kind_of(UserDecorator)
expect(assigns(:user)).to eq(@decorated_user)
end
end # describe "the GET #edit action" do
PATCH #update
describe "the PUT #update action" do
let(:put_update) {put :update, id: @user.id, user: @user_attributes}
context "is provided valid user params and" do
before :example do
@user_attributes = attributes_for(:user).merge({email: "vengeful_spirit@example.com"})
@user = User.create @user_attributes.merge({email: "sneaky_jugger@example.com"})
end
it_behaves_like "a 302 redirect request action", "@user" do
let!(:put_update) {put :update, id: @user.id, user: @user_attributes}
let(:redirect_path) {@user}
end
PATCH #update con't
it "changes user email attribute" do
expect(@user.reload.email).to eq("sneaky_jugger@example.com")
put_update
expect(@user.reload.email).to eq("vengeful_spirit@example.com")
end
it "provides a flash success message" do
put_update
expect(flash[:success]).to_not be_nil
end
end # "is provided valid user params and" do
PATCH #update con't con't
context "is provided invalid user params and" do
before :example do
@user_attributes = attributes_for(:user).merge({email: "vengeful_spirit.example.com"})
@user = User.create @user_attributes.merge({email: "sneaky_jugger@example.com"})
request.env["HTTP_REFERER"] = root_path
end
it_behaves_like "a 302 redirect request action", ":back (root_path)" do
let!(:put_update) {put :update, id: @user.id, user: @user_attributes}
let(:redirect_path) {root_path}
end
PATCH #update con't con't con't
it "fails to change user email attribute" do
expect(@user.reload.email).to eq("sneaky_jugger@example.com")
put_update
expect(@user.reload.email).to eq("sneaky_jugger@example.com")
end
it "provides a flash danger message" do
put_update
expect(flash[:danger]).to_not be_nil
end
end # "is provided invalid user params and" do
end # "the PUT #update action" do
DELETE #destroy
describe "the DELETE #destroy action" do
before :example do
@tag = create(:tag)
request.env["HTTP_REFERER"] = tags_path
end
let(:delete_destroy) {delete :destroy, id: @tag.id }
it "destroys @tag" do
expect {delete_destroy}.to change(Tag, :count).by(-1)
end
it_behaves_like "a 302 redirect request action", "tags_path (:back)" do
let!(:delete_destroy) {delete :destroy, id: @tag.id }
let(:redirect_path) {tags_path}
end
end
Resources
• Everyday Rails: How I learned to test my Rails applications
• Relish: RSpec Docs
• Code School: Testing with RSpec
• Code Examples
That's all Folks!
@pareidoliax
xandermiller.ca
xander.miller@gmail.com

More Related Content

PDF
Inversion Of Control
PDF
Rails 3: Dashing to the Finish
PDF
Advanced redux
PPT
Ruby on Rails testing with Rspec
PDF
Angular promises and http
PPTX
Firebase ng2 zurich
PDF
Reduxing like a pro
KEY
Sprout core and performance
Inversion Of Control
Rails 3: Dashing to the Finish
Advanced redux
Ruby on Rails testing with Rspec
Angular promises and http
Firebase ng2 zurich
Reduxing like a pro
Sprout core and performance

What's hot (20)

PDF
Quick start with React | DreamLab Academy #2
PDF
React lecture
PDF
Intro to Redux | DreamLab Academy #3
PDF
Introduction to ReactJS and Redux
PDF
Evan Schultz - Angular Summit - 2016
PDF
Implementing Server Side Data Synchronization for Mobile Apps
PDF
Reactive.architecture.with.Angular
PDF
«Работа с базами данных с использованием Sequel»
PDF
Server side data sync for mobile apps with silex
PDF
Timothy N. Tsvetkov, Rails 3.1
PDF
Creating a WYSIWYG Editor with React
PDF
Design for succcess with react and storybook.js
PDF
Interoperable Component Patterns
PDF
React.js workshop by tech47.in
PDF
Violet Peña - Storybook: A React Tool For Your Whole Team
PDF
Implementing data sync apis for mibile apps @cloudconf
PPTX
Peggy angular 2 in meteor
PPTX
PHPUnit with Mocking and Crawling
PDF
Reliable Javascript
PDF
Modern Web Developement
Quick start with React | DreamLab Academy #2
React lecture
Intro to Redux | DreamLab Academy #3
Introduction to ReactJS and Redux
Evan Schultz - Angular Summit - 2016
Implementing Server Side Data Synchronization for Mobile Apps
Reactive.architecture.with.Angular
«Работа с базами данных с использованием Sequel»
Server side data sync for mobile apps with silex
Timothy N. Tsvetkov, Rails 3.1
Creating a WYSIWYG Editor with React
Design for succcess with react and storybook.js
Interoperable Component Patterns
React.js workshop by tech47.in
Violet Peña - Storybook: A React Tool For Your Whole Team
Implementing data sync apis for mibile apps @cloudconf
Peggy angular 2 in meteor
PHPUnit with Mocking and Crawling
Reliable Javascript
Modern Web Developement
Ad

Viewers also liked (15)

PPTX
RSpec and Rails
PDF
Pt client-and-heaelth-history-for-big-loser-community
PPTX
Jhonathan galindo
PPTX
Nectar
PDF
Bala Portfolio
PPT
講演会スライド
PPTX
Nectar
PDF
Lifestyle balance-pie -e
DOC
Chemistry project
PPTX
PPTX
Kaedah fonetik
PPTX
PRESENTATION ON MOUNTAIN DEW sheni
PDF
RSpec 2 Best practices
PDF
Mobile + Cloud+ Big Data = Digital Win
RSpec and Rails
Pt client-and-heaelth-history-for-big-loser-community
Jhonathan galindo
Nectar
Bala Portfolio
講演会スライド
Nectar
Lifestyle balance-pie -e
Chemistry project
Kaedah fonetik
PRESENTATION ON MOUNTAIN DEW sheni
RSpec 2 Best practices
Mobile + Cloud+ Big Data = Digital Win
Ad

Similar to Controller specs (20)

PDF
Controller Testing: You're Doing It Wrong
PDF
Rupicon 2014 Action pack
ZIP
Rails 3 (beta) Roundup
PDF
Rails2 Pr
PDF
Ruby talk romania
PDF
Action Controller Overview, Season 2
KEY
Using and scaling Rack and Rack-based middleware
PDF
Ruby meetup-dry
PDF
Layouts and Rendering in Rails, Season 2
KEY
Routes Controllers
PPTX
RESTful modules in zf2
KEY
Building Web Service Clients with ActiveModel
KEY
Building Web Service Clients with ActiveModel
KEY
Ruby/Rails
PDF
Documenting from the Trenches
PDF
Say Goodbye to Procedural Programming - Nick Sutterer
PDF
Rails 3 overview
PDF
Rack Middleware
PPTX
RESTful services Design Lab
PDF
Efficient Rails Test Driven Development (class 3) by Wolfram Arnold
Controller Testing: You're Doing It Wrong
Rupicon 2014 Action pack
Rails 3 (beta) Roundup
Rails2 Pr
Ruby talk romania
Action Controller Overview, Season 2
Using and scaling Rack and Rack-based middleware
Ruby meetup-dry
Layouts and Rendering in Rails, Season 2
Routes Controllers
RESTful modules in zf2
Building Web Service Clients with ActiveModel
Building Web Service Clients with ActiveModel
Ruby/Rails
Documenting from the Trenches
Say Goodbye to Procedural Programming - Nick Sutterer
Rails 3 overview
Rack Middleware
RESTful services Design Lab
Efficient Rails Test Driven Development (class 3) by Wolfram Arnold

Recently uploaded (20)

PDF
Machine learning based COVID-19 study performance prediction
DOCX
The AUB Centre for AI in Media Proposal.docx
PDF
Mobile App Security Testing_ A Comprehensive Guide.pdf
PPTX
20250228 LYD VKU AI Blended-Learning.pptx
PDF
NewMind AI Weekly Chronicles - August'25 Week I
PDF
Build a system with the filesystem maintained by OSTree @ COSCUP 2025
PDF
NewMind AI Monthly Chronicles - July 2025
PDF
Electronic commerce courselecture one. Pdf
PDF
Shreyas Phanse Resume: Experienced Backend Engineer | Java • Spring Boot • Ka...
PPTX
Cloud computing and distributed systems.
PDF
Bridging biosciences and deep learning for revolutionary discoveries: a compr...
PDF
Agricultural_Statistics_at_a_Glance_2022_0.pdf
PDF
Chapter 3 Spatial Domain Image Processing.pdf
PPTX
Digital-Transformation-Roadmap-for-Companies.pptx
PPTX
Big Data Technologies - Introduction.pptx
PDF
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
PDF
Network Security Unit 5.pdf for BCA BBA.
PDF
Encapsulation theory and applications.pdf
PDF
Modernizing your data center with Dell and AMD
PDF
The Rise and Fall of 3GPP – Time for a Sabbatical?
Machine learning based COVID-19 study performance prediction
The AUB Centre for AI in Media Proposal.docx
Mobile App Security Testing_ A Comprehensive Guide.pdf
20250228 LYD VKU AI Blended-Learning.pptx
NewMind AI Weekly Chronicles - August'25 Week I
Build a system with the filesystem maintained by OSTree @ COSCUP 2025
NewMind AI Monthly Chronicles - July 2025
Electronic commerce courselecture one. Pdf
Shreyas Phanse Resume: Experienced Backend Engineer | Java • Spring Boot • Ka...
Cloud computing and distributed systems.
Bridging biosciences and deep learning for revolutionary discoveries: a compr...
Agricultural_Statistics_at_a_Glance_2022_0.pdf
Chapter 3 Spatial Domain Image Processing.pdf
Digital-Transformation-Roadmap-for-Companies.pptx
Big Data Technologies - Introduction.pptx
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
Network Security Unit 5.pdf for BCA BBA.
Encapsulation theory and applications.pdf
Modernizing your data center with Dell and AMD
The Rise and Fall of 3GPP – Time for a Sabbatical?

Controller specs

  • 7. RSpec Tips • Configuration: Color, Verbose • Alias bundle exec • description text should build the user story • add comments to your end statements
  • 9. Alias Bundle exec alias brspec="bundle exec rspec" alias be="bundle exec"
  • 10. Description Text builds a User Story TagsController when authorized User (admin) the DELETE #destroy action behaves like a 302 redirect request action redirects to :back (root_path)
  • 12. RSPec Gotchas • Scoping is weird it_behaves_like "a 302 redirect request action", ":back (root_path)" do let!(:put_update) {put :update, id: @user.id, user: @user_attributes} let(:redirect_path) {root_path} end • Relish Docs
  • 14. How to RSpec OO BB Object Oriented Black Box • Given (Context) • When (Event) • Then (Expected Result)
  • 16. Given • Session • Domain Object Layer status • Params
  • 17. When • HTTP Request with Params
  • 18. Then • Flash Messages • Assigns Instance Variables (decorators) • Domain Object Layer Changes
  • 19. Keeping it DRY • before Hooks (given) • let (when) • shared examples
  • 20. before :example before :example do @admin = create(:admin) session[:user_id] = @admin.id end
  • 21. let :example let!(:post_create) {post :create, user: @user_attributes} let(:redirect_path) {root_path}
  • 22. shared examples: 3 types of RESTful responses • successful GET action • redirect 302 action • unauthorized action 302 redirect
  • 23. successful GET action RSpec.shared_examples_for 'an unauthorized action' do it "responds redirect with an HTTP 302 status code" do expect(response).to be_redirect expect(response).to have_http_status(:found) end it "provides a flash alert message" do expect(flash[:warning]).to_not be_nil end it "redirects to login_path" do expect(response).to redirect_to login_path end end
  • 24. redirect 302 action RSpec.shared_examples_for "a 302 redirect request action" do |path_name| it "responds with a redirect HTTP 302 status code" do expect(response).to be_redirect expect(response).to have_http_status(:found) end it "redirects to #{path_name}" do expect(response).to redirect_to redirect_path end end
  • 25. unauthorized action 302 redirect RSpec.shared_examples_for 'an unauthorized action' do it "responds redirect with an HTTP 302 status code" do expect(response).to be_redirect expect(response).to have_http_status(:found) end it "provides a flash alert message" do expect(flash[:warning]).to_not be_nil end it "redirects to login_path" do expect(response).to redirect_to login_path end end
  • 26. Overall Structure of a Controller Spec
  • 27. require 'support/controller_helper' describe UsersController do context 'when unauthorized (no User)' do describe "the GET #new action" do end # describe "the GET #new action" do describe "the POST #create action" do context "is provided valid User params and" do end # context "is provided valid User params and" do context "is provided invalid User params and" do end # context "is provided invalid User params and" do end # describe "the POST #create action" do describe "the GET #show action" do end # describe "the GET #show action" do end # context 'when unauthorized (no User signed in)' do
  • 28. context 'when authorized (Admin User)' do describe "the GET #index action" do end #describe "the GET #index action" do describe "the PUT #update action" do context "is provided valid user params and" do end # "is provided valid user params and" do context "is provided invalid user params and" do end # "is provided invalid user params and" do end # "the PUT #update action" do end # context 'when authorized (Admin User)' do end
  • 30. Unauthorized Action describe "the GET #show action" do before :example do @user = create(:user) end it_behaves_like 'an unauthorized action' do let!(:get_show) {get :show, {id: @user.id}} end end # describe "the GET #show action" do
  • 32. GET #show describe "the GET #show action" do before :example do @user = create(:user) end it_behaves_like "a successful GET action", :show do let!(:get_show) {get :show, {id: @user.id}} end let(:get_show) {get :show, {id: @user.id}} it "assigns a valid UserDecorator of to @user" do get_show @decorated_user = UserDecorator.new @user expect(assigns(:user)).to be_kind_of(UserDecorator) expect(assigns(:user)).to eq(@decorated_user) end end # describe "the GET #show action" do
  • 33. GET #index describe "the GET #index action" do it_behaves_like "a successful GET action", :index do let!(:get_index) {get :index} end let(:get_index) {get :index}
  • 34. GET #index con'd it "loads the users in the current users, current region" do region = create(:region) user1, user2 = create(:user), create(:user) [@admin, user1, user2].each do |u| u.add_to_region! region u.current_region = region u.save end get_index expect(assigns(:users)).to match_array([@admin.reload, user1.reload, user2.reload]) end end #describe "the GET #index action" do
  • 35. GET #new describe "the GET #new action" do it_behaves_like "a successful GET action", :new do let!(:get_new) {get :new} end let!(:get_new) {get :new} it "assigns a unsaved User to @user" do expect(assigns(:user)).to be_kind_of(User) expect(assigns(:user)).to respond_to(:id).with(nil) end end # describe "the GET #new action" do
  • 36. POST #create describe "the POST #create action" do before :example do @user_attributes = attributes_for(:user) request.env["HTTP_REFERER"] = root_path end let(:post_create) {post :create, user: @user_attributes}
  • 37. POST #create con't context "is provided valid User params and" do it_behaves_like "a 302 redirect request action", ':back (to root_path)' do let!(:post_create) {post :create, user: @user_attributes} let(:redirect_path) {root_path} end it "creates a user" do expect { post_create }.to change(User, :count).by(1) end it "provides a flash success message" do post_create expect(flash[:success]).to_not be_nil end end # context "is provided valid User params and" do
  • 38. POST #create con't con't context "is provided invalid User params and" do before :example do @user_attributes = attributes_for(:user) User.create @user_attributes end it_behaves_like "a 302 redirect request action", 'new_user_path' do let!(:post_create) {post :create, user: @user_attributes} let(:redirect_path) {new_user_path} end it "fails to create a new user" do expect { post :create, user: @user_attributes }.not_to change(User, :count) end it "provides a flash danger message" do post_create expect(flash[:danger]).to_not be_nil end end # context "is provided invalid User params and" do end # describe "the POST #create action" do
  • 39. GET #edit describe "the GET #edit action" do before :example do @user = create(:user) end it_behaves_like "a successful GET action", :edit do let!(:get_edit) {get :edit, {id: @user.id}} end let(:get_edit) {get :edit, {id: @user.id}} it "loads all of the roles from User class into @roles" do roler = class_double("User") allow(roler).to receive(:roles).and_return([:worker, :manager, :organizer, :moderator, :admin]) get_edit expect(assigns(:roles)).to match_array([:worker, :manager, :organizer, :moderator, :admin]) end
  • 40. GET #edit c on't it "loads all of the regions from Region class into @regions" do region1, region2 = create(:region), create(:region) get_edit expect(assigns(:regions)).to match_array([region1, region2]) end it "assigns valid UserDecorator to @user" do get_edit @decorated_user = UserDecorator.new @user expect(assigns(:user)).to be_kind_of(UserDecorator) expect(assigns(:user)).to eq(@decorated_user) end end # describe "the GET #edit action" do
  • 41. PATCH #update describe "the PUT #update action" do let(:put_update) {put :update, id: @user.id, user: @user_attributes} context "is provided valid user params and" do before :example do @user_attributes = attributes_for(:user).merge({email: "vengeful_spirit@example.com"}) @user = User.create @user_attributes.merge({email: "sneaky_jugger@example.com"}) end it_behaves_like "a 302 redirect request action", "@user" do let!(:put_update) {put :update, id: @user.id, user: @user_attributes} let(:redirect_path) {@user} end
  • 42. PATCH #update con't it "changes user email attribute" do expect(@user.reload.email).to eq("sneaky_jugger@example.com") put_update expect(@user.reload.email).to eq("vengeful_spirit@example.com") end it "provides a flash success message" do put_update expect(flash[:success]).to_not be_nil end end # "is provided valid user params and" do
  • 43. PATCH #update con't con't context "is provided invalid user params and" do before :example do @user_attributes = attributes_for(:user).merge({email: "vengeful_spirit.example.com"}) @user = User.create @user_attributes.merge({email: "sneaky_jugger@example.com"}) request.env["HTTP_REFERER"] = root_path end it_behaves_like "a 302 redirect request action", ":back (root_path)" do let!(:put_update) {put :update, id: @user.id, user: @user_attributes} let(:redirect_path) {root_path} end
  • 44. PATCH #update con't con't con't it "fails to change user email attribute" do expect(@user.reload.email).to eq("sneaky_jugger@example.com") put_update expect(@user.reload.email).to eq("sneaky_jugger@example.com") end it "provides a flash danger message" do put_update expect(flash[:danger]).to_not be_nil end end # "is provided invalid user params and" do end # "the PUT #update action" do
  • 45. DELETE #destroy describe "the DELETE #destroy action" do before :example do @tag = create(:tag) request.env["HTTP_REFERER"] = tags_path end let(:delete_destroy) {delete :destroy, id: @tag.id } it "destroys @tag" do expect {delete_destroy}.to change(Tag, :count).by(-1) end it_behaves_like "a 302 redirect request action", "tags_path (:back)" do let!(:delete_destroy) {delete :destroy, id: @tag.id } let(:redirect_path) {tags_path} end end
  • 46. Resources • Everyday Rails: How I learned to test my Rails applications • Relish: RSpec Docs • Code School: Testing with RSpec • Code Examples