1

我在理解我的测试有什么问题时遇到了一些麻烦,但是在测试控制器的更新方法时,我不断收到 No Route Match。不过,通过浏览器提交表单是可行的。

我的路线文件:

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>'

有什么提示吗?

4

2 回答 2

3

您需要传入id用户的参数才能正确运行测试。

试试这个:

put :update, id: user.id, merchant_user: {}

您看到此错误是因为路由器期望resource/:id,但您没有传递 id。

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

于 2013-07-11T23:19:23.103 回答
2

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

如果您rake routes从命令行执行,它可能会显示一条看起来像

/merchant/users/:id/update

如果你id像这样传递put :update, id: user.id, merchant_user: user.attributes它应该可以工作。

于 2013-07-11T23:38:41.750 回答