我正在自学编写控制器测试,并且得到了这个错误:
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') do
和put :update, post: {title: 'My Post', body: 'Updated Ipsum’}
答案 0 :(得分:0)
您需要将id
传递给update
操作:
put :update, id: <THE ID HERE>, post: {title: 'My Post', body: 'Updated Ipsum'}
答案 1 :(得分:0)
根据您控制器中的update
操作,您需要传递id
中post
的{{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