Permalink
Browse files

Update the controller spec generated by the scaffold generator.

- use any_instance where appropriate
- remove mock_model
- add some documentatio
  • Loading branch information...
1 parent 6385228 commit daef552453e89616e2762e87c0a77dc9b08a2220 @dchelimsky dchelimsky committed Apr 24, 2011
Showing with 77 additions and 41 deletions.
  1. +77 −41 lib/generators/rspec/scaffold/templates/controller_spec.rb
View
118 lib/generators/rspec/scaffold/templates/controller_spec.rb
@@ -3,71 +3,98 @@
# This spec was generated by rspec-rails when you ran the scaffold generator.
# It demonstrates how one might use RSpec to specify the controller code that
# was generated by the Rails when you ran the scaffold generator.
+#
+# Caveats:
+#
+# This assumes that the implementation code is the stock implemenation code
+# generated by the rails scaffold generator. If you are using any extension
+# libraries to generate different controller code, this generated spec may or
+# may not work.
+#
+# This only uses APIs available in rails and/or rspec-rails. There are a
+# number of tools you can use to make these specs even more expressive, but
+# we're sticking to rails and rspec-rails APIs to keep things simple and
+# stable.
+#
+# Compared to earlier versions of this generator, there is very limited use
+# of stubs and message expectations in this spec. Stubs are only used when
+# there is no simpler way to get a handle on the object needed for the
+# example. Message expectations are only used when there is no simpler way to
+# specify that an instance is receiving a specific message.
describe <%= controller_class_name %>Controller do
- def <%= mock_file_name %>(stubs={})
- @<%= mock_file_name %> ||= mock_model(<%= class_name %>, stubs).as_null_object
+ # This should return the minimal set of attributes required to create a valid
+ # <%= class_name %>. As you add validations to <%= class_name %>, be sure to
+ # update the return value of this method accordingly.
+ def valid_attributes
+ {}
end
<% unless options[:singleton] -%>
describe "GET index" do
it "assigns all <%= table_name.pluralize %> as @<%= table_name.pluralize %>" do
- <%= stub orm_class.all(class_name) %> { [<%= mock_file_name %>] }
+ <%= file_name %> = <%= class_name %>.create! valid_attributes
get :index
- assigns(:<%= table_name %>).should eq([<%= mock_file_name %>])
+ assigns(:<%= table_name %>).should eq([<%= file_name %>])
end
end
<% end -%>
describe "GET show" do
it "assigns the requested <%= ns_file_name %> as @<%= ns_file_name %>" do
- <%= stub orm_class.find(class_name, "37".inspect) %> { <%= mock_file_name %> }
- get :show, :id => "37"
- assigns(:<%= ns_file_name %>).should be(<%= mock_file_name %>)
+ <%= file_name %> = <%= class_name %>.create! valid_attributes
+ get :show, :id => <%= file_name %>.id.to_s
+ assigns(:<%= ns_file_name %>).should eq(<%= file_name %>)
end
end
describe "GET new" do
it "assigns a new <%= ns_file_name %> as @<%= ns_file_name %>" do
- <%= stub orm_class.build(class_name) %> { <%= mock_file_name %> }
get :new
- assigns(:<%= ns_file_name %>).should be(<%= mock_file_name %>)
+ assigns(:<%= ns_file_name %>).should be_a_new(<%= class_name %>)
end
end
describe "GET edit" do
it "assigns the requested <%= ns_file_name %> as @<%= ns_file_name %>" do
- <%= stub orm_class.find(class_name, "37".inspect) %> { <%= mock_file_name %> }
- get :edit, :id => "37"
- assigns(:<%= ns_file_name %>).should be(<%= mock_file_name %>)
+ <%= file_name %> = <%= class_name %>.create! valid_attributes
+ get :edit, :id => <%= file_name %>.id.to_s
+ assigns(:<%= ns_file_name %>).should eq(<%= file_name %>)
end
end
describe "POST create" do
describe "with valid params" do
+ it "creates a new <%= class_name %>" do
+ expect {
+ post :create, :<%= ns_file_name %> => valid_attributes
+ }.to change(<%= class_name %>, :count).by(1)
+ end
+
it "assigns a newly created <%= ns_file_name %> as @<%= ns_file_name %>" do
- <%= stub orm_class.build(class_name, params) %> { <%= mock_file_name(:save => true) %> }
- post :create, :<%= ns_file_name %> => <%= params %>
- assigns(:<%= ns_file_name %>).should be(<%= mock_file_name %>)
+ post :create, :<%= ns_file_name %> => valid_attributes
+ assigns(:<%= ns_file_name %>).should be_a(<%= class_name %>)
+ assigns(:<%= ns_file_name %>).should be_persisted
end
it "redirects to the created <%= ns_file_name %>" do
- <%= stub orm_class.build(class_name) %> { <%= mock_file_name(:save => true) %> }
- post :create, :<%= ns_file_name %> => {}
- response.should redirect_to(<%= table_name.singularize %>_url(<%= mock_file_name %>))
+ post :create, :<%= ns_file_name %> => valid_attributes
+ response.should redirect_to(<%= class_name %>.last)
end
end
describe "with invalid params" do
it "assigns a newly created but unsaved <%= ns_file_name %> as @<%= ns_file_name %>" do
- <%= stub orm_class.build(class_name, params) %> { <%= mock_file_name(:save => false) %> }
- post :create, :<%= ns_file_name %> => <%= params %>
- assigns(:<%= ns_file_name %>).should be(<%= mock_file_name %>)
+ # Trigger the behavior that occurs when invalid params are submitted
+ <%= class_name %>.any_instance.stub(:save).and_return(false)
+ post :create, :<%= ns_file_name %> => {}
+ assigns(:<%= ns_file_name %>).should be_a_new(<%= class_name %>)
end
it "re-renders the 'new' template" do
- <%= stub orm_class.build(class_name) %> { <%= mock_file_name(:save => false) %> }
+ # Trigger the behavior that occurs when invalid params are submitted
+ <%= class_name %>.any_instance.stub(:save).and_return(false)
post :create, :<%= ns_file_name %> => {}
response.should render_template("new")
end
@@ -77,49 +104,58 @@ def <%= mock_file_name %>(stubs={})
describe "PUT update" do
describe "with valid params" do
it "updates the requested <%= ns_file_name %>" do
- <%= stub orm_class.find(class_name, "37".inspect) %> { <%= mock_file_name %> }
- mock_<%= should_receive orm_instance.update_attributes(params) %>
- put :update, :id => "37", :<%= ns_file_name %> => <%= params %>
+ <%= file_name %> = <%= class_name %>.create! valid_attributes
+ # Assuming there are no other <%= table_name %> in the database, this
+ # specifies that the <%= class_name %> created on the previous line
+ # receives the :update_attributes message with whatever params are
+ # submitted in the request.
+ <%= class_name %>.any_instance.should_receive(:update_attributes).with(<%= params %>)
+ put :update, :id => <%= file_name %>.id, :<%= ns_file_name %> => <%= params %>
end
it "assigns the requested <%= ns_file_name %> as @<%= ns_file_name %>" do
- <%= stub orm_class.find(class_name) %> { <%= mock_file_name(:update_attributes => true) %> }
- put :update, :id => "1"
- assigns(:<%= ns_file_name %>).should be(<%= mock_file_name %>)
+ <%= file_name %> = <%= class_name %>.create! valid_attributes
+ put :update, :id => <%= file_name %>.id, :<%= ns_file_name %> => valid_attributes
+ assigns(:<%= ns_file_name %>).should eq(<%= file_name %>)
end
it "redirects to the <%= ns_file_name %>" do
- <%= stub orm_class.find(class_name) %> { <%= mock_file_name(:update_attributes => true) %> }
- put :update, :id => "1"
- response.should redirect_to(<%= table_name.singularize %>_url(<%= mock_file_name %>))
+ <%= file_name %> = <%= class_name %>.create! valid_attributes
+ put :update, :id => <%= file_name %>.id, :<%= ns_file_name %> => valid_attributes
+ response.should redirect_to(<%= file_name %>)
end
end
describe "with invalid params" do
it "assigns the <%= ns_file_name %> as @<%= ns_file_name %>" do
- <%= stub orm_class.find(class_name) %> { <%= mock_file_name(:update_attributes => false) %> }
- put :update, :id => "1"
- assigns(:<%= ns_file_name %>).should be(<%= mock_file_name %>)
+ <%= file_name %> = <%= class_name %>.create! valid_attributes
+ # Trigger the behavior that occurs when invalid params are submitted
+ <%= class_name %>.any_instance.stub(:save).and_return(false)
+ put :update, :id => <%= file_name %>.id.to_s
+ assigns(:<%= ns_file_name %>).should eq(<%= file_name %>)
end
it "re-renders the 'edit' template" do
- <%= stub orm_class.find(class_name) %> { <%= mock_file_name(:update_attributes => false) %> }
- put :update, :id => "1"
+ <%= file_name %> = <%= class_name %>.create! valid_attributes
+ # Trigger the behavior that occurs when invalid params are submitted
+ <%= class_name %>.any_instance.stub(:save).and_return(false)
+ put :update, :id => <%= file_name %>.id.to_s
response.should render_template("edit")
end
end
end
describe "DELETE destroy" do
it "destroys the requested <%= ns_file_name %>" do
- <%= stub orm_class.find(class_name, "37".inspect) %> { <%= mock_file_name %> }
- mock_<%= should_receive orm_instance.destroy %>
- delete :destroy, :id => "37"
+ <%= file_name %> = <%= class_name %>.create! valid_attributes
+ expect {
+ delete :destroy, :id => <%= file_name %>.id.to_s
+ }.to change(<%= class_name %>, :count).by(-1)
end
it "redirects to the <%= table_name %> list" do
- <%= stub orm_class.find(class_name) %> { <%= mock_file_name %> }
- delete :destroy, :id => "1"
+ <%= file_name %> = <%= class_name %>.create! valid_attributes
+ delete :destroy, :id => <%= file_name %>.id.to_s
response.should redirect_to(<%= index_helper %>_url)
end
end

0 comments on commit daef552

Please sign in to comment.