Ruby on rails Can';rspec测试中的符号转换为整数
我正在编写一个简单的测试来检查我的控制器是否工作,但是我的测试不断返回Ruby on rails Can';rspec测试中的符号转换为整数,ruby-on-rails,ruby-on-rails-3,rspec,factory-bot,Ruby On Rails,Ruby On Rails 3,Rspec,Factory Bot,我正在编写一个简单的测试来检查我的控制器是否工作,但是我的测试不断返回 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
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)>'
这是我的模型的链接
编辑:问题似乎源于我的控制器。在我的本地服务器上,返回
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
我的代码有什么问题,如何修复?尝试将id:to:id更改为:
before do
put :update, :id => @user.password_reset_token
end
您是否确实在使用
描述“测试控制器”
?如果是这样,您可以尝试将其更改为descripe tests controller
或descripe users controller
(以适当的为准),以便RSpec知道正在测试的控制器
否则,您可以发布异常消息的完整回溯吗?如果更改此行,会发生什么情况:
redirect_to new_password_reset_path, flash[:error] = "Password reset has expired"
致:
?
我的猜测是,您不应该能够在
重定向到中调用flash[:error]=
,因为Ruby中的赋值返回被赋值的值redirect_to
需要散列作为第二个参数,但它被作为字符串调用。您没有传递:user参数,因此此行可能会给您一个错误:
elsif @user.update_attributes(params[:user])
试着做:
before do
put :update, :id => @user.password_reset_token, :user => valid_user_attributes
end
将有效的_user_属性设置为所需的更新,例如{'email'=>'new_email@x.x“}不,我正在使用自己的从头开始的身份验证系统。对于密码重置,我是在Ryan Bates Railscast密码重置后设计的。他和我的代码几乎是一字不差的。你能确保第二个“before”在第一个之后执行吗?在规范中的:update操作之前尝试调试。我甚至尝试将FactoryGirl创建和后续属性添加放在:update操作之前,但仍然一无所获。在此之前,我使用get:edit,id:@user.password\u reset\u token
编写了一个测试,测试通过了。我使用了适当的descripe MyController语法。我想指出的是,在玩了一段时间之后,我认为这不是rspec的问题。当实际测试我的应用程序时,我的页面上会弹出一个错误。它在PasswordResetController中返回类型错误#update无法将符号转换为字符串
。我在问题中公布了控制器代码,因为这似乎是问题所在。控制器代码的第19行是哪一行?
elsif @user.update_attributes(params[:user])
before do
put :update, :id => @user.password_reset_token, :user => valid_user_attributes
end