1

我正在编写一个简单的测试来检查我的控制器是否工作,但是我的测试不断返回

3) PasswordResetsController for checking update succeeds 
 Failure/Error: put :update, id: @user.password_reset_token
 TypeError:
   can't convert Symbol into Integer
 # ./app/controllers/password_resets_controller.rb:23:in `update'
 # ./spec/controllers/password_resets_controller_spec.rb:52:in `block (3 levels) in 
 <top (required)>'

我的测试如下...

describe PasswordResetsController do

before do
  @user = FactoryGirl.create( :user )
end

context "for checking update succeeds" do
  before do
    @user.password_reset_token = "gB5KGF-3hC4RNHCK5niz9A"
    @user.password_reset_sent_at = Time.zone.now
    @user.save!(validate: false) 
    put :update, id: @user.password_reset_token
  end


  it { should assign_to(:user) }      
  it { should respond_with(:redirect) }
  it { should redirect_to(signin_path) }
  it { should set_the_flash.to("Password has been reset.")}

end

end

这是我的模型的链接https://github.com/thejourneydude/template/blob/master/app/models/user.rb

编辑:看来问题出在我的控制器上。在我的本地服务器上,我返回

TypeError in PasswordResetsController#update

can't convert Symbol into String

Rails.root: /home/jason/ror/template
Application Trace | Framework Trace | Full Trace

app/controllers/password_resets_controller.rb:19:in `update'

我的控制器代码中的更新操作是..

def update
  @user = User.find_by_password_reset_token!(params[:id])
  if @user.password_reset_sent_at && @user.password_reset_sent_at > 2.hours.ago
    redirect_to new_password_reset_path, flash: { error: "Password reset has expired" }
  elsif @user.update_attributes(params[:user])
    redirect_to root_url, flash: { success: "Password has been reset." }
  else 
    render :edit, flash: { error: "Hmm.. something went wrong. Let's try that again." }
  end
end

我的代码有什么问题,我该如何解决?

4

4 回答 4

1

如果更改此行会发生什么:

redirect_to new_password_reset_path, flash[:error] = "Password reset has expired"

到:

redirect_to new_password_reset_path, flash: { error: "Password reset has expired" }

?

我的猜测是你应该不能调用flash[:error] =redirect_to因为 Ruby 中的赋值返回被赋值的值。 redirect_to需要哈希作为第二个参数,但它被称为字符串。

于 2012-12-07T03:27:30.127 回答
1

你没有传递 :user 参数,所以也许这一行会给你一个错误:

elsif @user.update_attributes(params[:user])

尝试做:

before do
  put :update, :id => @user.password_reset_token, :user => valid_user_attributes
end

将 valid_user_attributes 设置为您想要的更新,例如 { 'email' => 'new_email@xx' }

于 2012-12-07T16:18:57.587 回答
0

尝试将 id: 更改为 :id,如下所示:

before do
   put :update, :id => @user.password_reset_token
 end
于 2012-12-04T20:03:59.163 回答
0

你真的在用describe "tests controller"吗?如果是这样,您可以尝试将其更改为describe TestsControllerdescribe UsersController(以适当的为准),以便 RSpec 知道正在测试的控制器。

否则,您可以从异常消息中发布完整的回溯吗?

于 2012-12-05T04:32:58.597 回答