Replicating Form Behaviour in Functional Test


#1

Hi,

I’m really struggling getting a controller test to pass while the form
that uses the method operates correctly.

I would really welcome a second pair of eyes to help me find out what
I’m missing.

The test

def test_set_password
@request.session[:user] = users(:admin)

put :set_password, :id => users(:one).id, :user => {:password =>

“newpass”, :password_confirmation => “newpass”}

assert User.authenticate(users(:one).username, "newpass")
assert_redirected_to user_path(assigns(:user))

end

The controller method

POST

def set_password
@user = User.find(params[:id])

respond_to do |format|
  if @user.update_attributes(params[:user])
    flash[:notice] = 'Password updated.'
    format.html { redirect_to(@user) }
    format.xml  { head :ok }
  else
    format.html { render :action => "edit_password" }
    format.xml  { render :xml => @user.errors, :status

=> :unprocessable_entity }
end
end
end

The view: edit_password.html.erb

<%= error_messages_for :user %>

<%= @user.username%>

<% form_for @user, :url => {:id => @user.id, :action =>
“set_password”} do |f| %>

<%= f.label :password %>
<%= f.password_field :password %>

<%= f.label :password_confirmation, "Confirm Password" %>
<%= f.password_field :password_confirmation %>

<%= submit_tag "Change" %>

<% end %>

<%= link_to ‘Back’, @user %>

The view works but the test fails.

Thanks in advance,

Adam


#2

On 5 Dec 2008, at 14:02, Adam wrote:

The view works but the test fails.

You need to work out why. stick a breakpoint in the action (or in
whatever before filters may be relevant) and see what happens

Fred


#3

OK, thanks Fred. I guess it’s nothing obvious which is sort of
reassuring.

Adam

On Dec 5, 3:27 pm, Frederick C. removed_email_address@domain.invalid


#4

On Dec 6, 12:59 pm, Adam removed_email_address@domain.invalid wrote:

OK, thanks Fred. I guess it’s nothing obvious which is sort of
reassuring.

Well there is one thing that I refrained from commenting upon because
I’ve no idea how you do your authentication, but in my apps

@request.session[:user] = users(:admin)

would be

@request.session[:user] = users(:admin).id

But that should be quite obvious if you look at test.log (it would say
that processing was halted because the authorization filter redirected
or rendered)

Fred


#5

OK, thanks for that advice.

It’s not the problem the test is railing on the first assertion. It’s
the update of the user record that’s failing for some reason.

Adam

On Dec 6, 1:08 pm, Frederick C. removed_email_address@domain.invalid