【发布时间】:2014-09-26 20:31:04
【问题描述】:
我编写了以下测试,尝试将已发布的帖子更新为已保存。这意味着用户已经发布了一篇文章,现在想要将其标记为已保存。这是我不允许的。
it "should not update a post from published to saved" do
@post = FactoryGirl.create(:post, blog_id: @blog.id, saved: false, published: true)
put :update, :id => @post.id, post: {title: 'Sample Title', content: @post.content, saved: true}
expect(response.status).to eql 422
end
这个特定的测试状态:
AbstractController::DoubleRenderError: 在此操作中多次调用渲染和/或重定向。
这不应该是这样,因为如果我们看一下抛出它的方法:
def post_controller_save(post, params)
do_not_save_published_post(post, params)
binding.pry
publish_post(post, params)
if post.save
set_tags(post, params)
set_categories(post, params)
render json: post, status: 200
else
render json: {:errors => post.errors}, status: 422
end
end
我们做的第一个检查是do_not_save_published_posts(post, params)(注意它后面的binding.pry)。
所以如果我们按照这个,我们会看到有问题的方法(这是一个私有方法):
def do_not_save_published_post(post, params)
if (post.published && params[:post][:saved])
binding.pry
render json: {:errors => 'Cannot save a published post.'}, status: 422
return
end
end
此方法检查相关帖子是否已发布。并且 post 对象的参数包含已保存的参数。如果这两个都为真,我们将呈现错误并返回。这里的关键是注意这个binding.pry。
在测试中,它到达这个断点,然后键入exit 会导致跳过返回并捕获此方法之外的binding.pry。
这不应该发生。它应该为我呈现状态为 422 的 json。事实上,do_not_save_published_post 是一个私有方法是一个促成因素吗?
【问题讨论】: