Gordon
2012-Jan-16 10:59 UTC
[rspec-users] what does ''these'' mean in a PUT controller spec?
hi, all,
the spec above is found in my controller spec for a
''category''
resource.
It''s a generated spec.
----- start extract --------------------------------------------
describe "PUT update" do
describe "with valid params" do
it "updates the requested category" do
category = Category.create! valid_attributes
# Assuming there are no other categories in the database, this
# specifies that the Category created on the previous line
# receives the :update_attributes message with whatever params
are
# submitted in the request.
Category.any_instance.should_receive(:update_attributes).with({''these''
=> ''params''})
put :update, :id => category.id, :category =>
{''these'' =>
''params''}
end
----- end extract --------------------------------------------
When the spec is run, it fails with the error below.
----- start extract --------------------------------------------
1) CategoriesController PUT update with valid params updates the
requested category
Failure/Error: put :update, :id => category.id, :category =>
{''these'' => ''params''}
#<Category:0x000001017cd498> received :update_attributes with
unexpected arguments
expected: ({"these"=>"params"})
got: ({"these"=>"params",
"updated_by"=>1})
# /Users/anexiole/projects/try_rails/app/controllers/
categories_controller.rb:72:in `block in update''
# /Users/anexiole/projects/try_rails/app/controllers/
categories_controller.rb:71:in `update''
# ./categories_controller_spec.rb:92:in `block (4 levels) in <top
(required)>''
Finished in 19.15 seconds
16 examples, 1 failure
Failed examples:
rspec ./categories_controller_spec.rb:85 # CategoriesController PUT
update with valid params updates the requested category
----- end extract --------------------------------------------
My ''update'' method in the categories controller file itself
has one
added rule for which
I will assign the current user''s id to the updated_by attribute
before a call to update_attribute is made.
----- start extract --------------------------------------------
# PUT /categories/1
# PUT /categories/1.json
def update
# Record current user''s id as he/she created the part
params[:category][:updated_by] = current_user.id
@category = Category.find(params[:id])
respond_to do |format|
if @category.update_attributes(params[:category])
format.html { redirect_to @category, notice: ''Category was
successfully updated.'' }
format.json { head :ok }
else
format.html { render action: "edit" }
format.json { render json: @category.errors,
status: :unprocessable_entity }
end
end
end
----- end extract --------------------------------------------
Can someone please tell me what does ''these'' refer to in the
spec?
Where can I read up more about them?
I would like to fix the failing spec example.
Thank you
Gorodn
David Chelimsky
2012-Jan-16 13:17 UTC
[rspec-users] what does ''these'' mean in a PUT controller spec?
On Jan 16, 2012, at 4:59 AM, Gordon wrote:> hi, all, > > the spec above is found in my controller spec for a ''category'' > resource. > > It''s a generated spec. > > ----- start extract -------------------------------------------- > describe "PUT update" do > describe "with valid params" do > it "updates the requested category" do > category = Category.create! valid_attributes > # Assuming there are no other categories in the database, this > # specifies that the Category created on the previous line > # receives the :update_attributes message with whatever params > are > # submitted in the request. > > Category.any_instance.should_receive(:update_attributes).with({''these'' > => ''params''}) > put :update, :id => category.id, :category => {''these'' => > ''params''} > end > ----- end extract -------------------------------------------- > > When the spec is run, it fails with the error below. > > ----- start extract -------------------------------------------- > > 1) CategoriesController PUT update with valid params updates the > requested category > Failure/Error: put :update, :id => category.id, :category => > {''these'' => ''params''} > #<Category:0x000001017cd498> received :update_attributes with > unexpected arguments > expected: ({"these"=>"params"}) > got: ({"these"=>"params", "updated_by"=>1}) > # /Users/anexiole/projects/try_rails/app/controllers/ > categories_controller.rb:72:in `block in update'' > # /Users/anexiole/projects/try_rails/app/controllers/ > categories_controller.rb:71:in `update'' > # ./categories_controller_spec.rb:92:in `block (4 levels) in <top > (required)>'' > > Finished in 19.15 seconds > 16 examples, 1 failure > > Failed examples: > > rspec ./categories_controller_spec.rb:85 # CategoriesController PUT > update with valid params updates the requested category > > ----- end extract -------------------------------------------- > > My ''update'' method in the categories controller file itself has one > added rule for which > I will assign the current user''s id to the updated_by attribute > before a call to update_attribute is made. > > ----- start extract -------------------------------------------- > # PUT /categories/1 > # PUT /categories/1.json > def update > # Record current user''s id as he/she created the part > params[:category][:updated_by] = current_user.id > > @category = Category.find(params[:id]) > > respond_to do |format| > if @category.update_attributes(params[:category]) > format.html { redirect_to @category, notice: ''Category was > successfully updated.'' } > format.json { head :ok } > else > format.html { render action: "edit" } > format.json { render json: @category.errors, > status: :unprocessable_entity } > end > end > end > > ----- end extract -------------------------------------------- > > > Can someone please tell me what does ''these'' refer to in the spec? > Where can I read up more about them? > I would like to fix the failing spec example.What''s being specified here is that the contents of params[:category] are passed to update attributes. What they actually contain is not of concern to the controller or the controller spec, since they get passed directly to the model in the generated controller. ''these'' => ''params'' could just as easily be ''foo'' => ''bar''. The important thing is that the same params get received by the model object. The reason the spec is failing now is that the line you added modifies the hash before it gets sent to model object. If you change the spec to this: Category.any_instance.should_receive(:update_attributes).with(''these'' => ''params'', ''updated_by'' => 1) then it will pass. If you find ''these'' => ''params'' to be confusing, feel free to change it to what ever you like. Just make sure you do so in both places in the example. HTH, David