Rails控制器测试:ActionController :: UrlGenerationError:没有路由匹配

时间:2015-10-12 01:31:45

标签: ruby-on-rails controller

我正在自学编写控制器测试,并且得到了这个错误:

ERROR["test_should_update_post", PostsControllerTest, 2015-10-11 12:12:31 -0400]
 test_should_update_post#PostsControllerTest (1444579951.69s)
ActionController::UrlGenerationError:         ActionController::UrlGenerationError: No route matches {:action=>"update", :controller=>"posts", :post=>{:title=>"My Post", :body=>"Updated Ipsum"}}
            test/controllers/posts_controller_test.rb:51:in `block (2 levels) in <class:PostsControllerTest>'
            test/controllers/posts_controller_test.rb:50:in `block in <class:PostsControllerTest>’

这是我的测试:

test "should update post" do 
  assert_difference('Post.count') do 
    put :update, post: {title: 'My Post', body: 'Updated Ipsum'}
  end

  assert_redirected_to post_path(assigns(:post))
end

这是我的名字:

entry_one:
  title: "Foobar"
  body: "Ipsum This"

entry_two:
  title: "Barfoo"
  body: "This Ipsum"

这是我的控制者:

def update
    @post = Post.find(params[:id])

    if @post.update(post_params)
        redirect_to @post, notice: 'Event updated successfully'
    else
        render :edit
    end
end

你能指出我需要解决的问题吗?

我可以从错误和行数中看出它与行有关: assert_difference('Post.count') doput :update, post: {title: 'My Post', body: 'Updated Ipsum’}

3 个答案:

答案 0 :(得分:0)

您需要将id传递给update操作:

put :update, id: <THE ID HERE>, post: {title: 'My Post', body: 'Updated Ipsum'}

答案 1 :(得分:0)

根据您控制器中的update操作,您需要传递idpost的{​​{1}}。

因此,在您的测试中,像这样构建您的params哈希:

params

然后,使用let(:update_query_parameters) { { post: { title: 'My Post', body: 'Updated Ipsum' }, id: post.id } } update_query_parameters方式传递params

put :update

答案 2 :(得分:0)

感谢上面两位评论者,我能够理解我需要解决的问题:我需要在更新测试中传递一个id。

我已经在同一个应用程序的类似编辑测试中完成了这个,我知道要尝试什么。

我之前在测试中使用了一种设置方法,将我上面共享的yaml传递给我的测试:

def setup
   @post = posts(:entry_one)
end

使用这种方法,我可以将@ post.id传递给我的更新测试并让它传递给我:

test "should update post" do 
  assert_no_difference('Post.count') do 
    put :update, id: @post.id, post: {title: 'My Post', body: 'Updated Ipsum'}
  end

  assert_redirected_to post_path(assigns(:post))
end