Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 测试Rails 4控制器_Ruby On Rails_Ruby_Testing - Fatal编程技术网

Ruby on rails 测试Rails 4控制器

Ruby on rails 测试Rails 4控制器,ruby-on-rails,ruby,testing,Ruby On Rails,Ruby,Testing,我在理解我的测试可能有什么问题时遇到了一些困难,但在测试控制器的更新方法时,我始终没有得到任何路由匹配。不过,通过浏览器提交表单是可行的 我的路由文件: namespace :merchant do resources :users get '/signup', to: "users#new" end 我的控制器: def update respond_to do |format| if @merchant_user.update(user_params)

我在理解我的测试可能有什么问题时遇到了一些困难,但在测试控制器的更新方法时,我始终没有得到任何路由匹配。不过,通过浏览器提交表单是可行的

我的路由文件:

namespace :merchant do
    resources :users
    get '/signup', to: "users#new"
 end
我的控制器:

def update
  respond_to do |format|
    if @merchant_user.update(user_params)
      format.html { redirect_to @merchant_user, notice: 'User was successfully updated.' }
      format.json { head :no_content }
    else
      format.html { render action: 'show' }
      format.json { render json: @merchant_user.errors, status: :unprocessable_entity }
    end
  end
end
我的测试:

test "should update user" do
   user = users(:jon)
   user.first_name="Jonas"
   put :update, :merchant_user =>user.attributes
   assert_response :success
结束

结果:

1) Error:
Merchant::UsersControllerTest#test_should_update_user:
ActionController::UrlGenerationError: No route matches {:merchant_user=>  {"id"=>"846114006", "email"=>"jon.sims@whatever.com", "first_name"=>"Jonas", "last_name"=>"Sims", "password_digest"=>"$2a$10$LVbV7pkd7li8sobYEauoS.4JVA2ZHzAXgPFbyiojYqgcDBHUE9bXW", "type"=>"Merchant::User", "created_at"=>"2013-07-11 22:59:41 UTC", "updated_at"=>"2013-07-11 22:59:41 UTC"}, :controller=>"merchant/users", :action=>"update"}
test/controllers/merchant/users_controller_test.rb:45:in `block in <class:UsersControllerTest>'
1)错误:
商户::用户控制器测试#测试"应更新"用户:
ActionController::UrlGenerationError:没有路由匹配{:merchant_用户=>{“id”=>“846114006”,“电子邮件”=>“jon”。sims@whatever.com“,”名字“=>”乔纳斯“,”姓氏“=>”市民“,”密码摘要“=>”$2a$10$LVbV7pkd7li8sobYEauoS.4JVA2ZHZAXGPFBYIOJQGCDBHUE9BXW“,”键入“=>”商户::用户“,”创建时间“=>”2013-07-11 22:59:41 UTC“,”更新时间“=>“2013-07-11 22:59:41 UTC”},:controller=>“商户/用户”,:action=>“更新”}
测试/控制器/商户/用户\u控制器\u测试。rb:45:in'block in'

有任何提示吗?

您需要输入用户的
id
,测试才能正确运行

试试这个:

put :update, id: user.id, merchant_user: {}
您看到此错误是因为路由器需要
资源/:id
,但您没有传递该id


Users#update
是一个成员操作,它需要一个id。路由器需要一个用户id参数:
/Users/:id/update
。如果没有id,该方法将无法找到要更新的用户。

您需要通过用户的
id
,测试才能正确运行

试试这个:

put :update, id: user.id, merchant_user: {}
您看到此错误是因为路由器需要
资源/:id
,但您没有传递该id


Users#update
是一个成员操作,它需要一个id。路由器需要一个用户id参数:
/Users/:id/update
。如果没有id,该方法将无法找到要更新的用户。

从路由的外观来看,它似乎需要一个
id
参数

如果从命令行执行
rake routes
,它可能会显示一条类似

/merchant/users/:id/update


如果您像这样传入
id
,输入:update,id:user.id,merchant\u user:user.attributes它应该可以工作。

从您的路线看起来,它似乎需要一个
id
参数

如果从命令行执行
rake routes
,它可能会显示一条类似

/merchant/users/:id/update


如果你像这样通过
id
输入:update,id:user.id,merchant\u user:user.attributes它应该可以工作。

稍后会测试,但这可能是一个新手在Rails上重新学习的问题:)。就是这样。谢谢Mohamad和Leo Correa。虽然他们都帮助了我,但我会接受Leo的答案。稍后会测试,但是似乎这可能是一个新手在铁路上再次接车时遇到的问题:)。就是这样。谢谢穆罕默德和利奥·科雷亚。虽然他们都帮助了我,但我会接受利奥的回答。