Ruby on Rails教程:Microposts控制器测试错误修复咨询
问题修复方案
1. 创建测试计数未增加的修复
核心原因
测试中未正确关联用户,导致Micropost因缺少user_id触发验证失败,无法保存。
具体修复
- 检查Microposts控制器
create方法:
必须通过当前登录用户关联创建帖子,而非直接新建:def create # 用current_user的关联方法build,自动填充user_id @micropost = current_user.microposts.build(micropost_params) if @micropost.save redirect_to root_path, notice: "Micropost created!" else @feed_items = current_user.feed.paginate(page: params[:page]) render 'static_pages/home' end end - 检查创建测试代码:
确保测试前已登录有效用户,请求参数只传递帖子内容:
若未登录用户,test "should create micropost" do login_as(@user) # 若使用Devise,或手动设置session[:user_id] = @user.id assert_difference 'Micropost.count', 1 do post microposts_path, params: { micropost: { content: "Lorem ipsum" } } end assert_redirected_to root_path endcurrent_user为nil,创建的帖子无user_id,触发User must exist验证导致保存失败,计数不增加。
2. 更新测试422/RecordInvalid的修复
核心原因
要么测试未登录帖子所有者导致权限不足,要么参数错误允许修改user_id,要么控制器缺少权限校验。
具体修复
- 检查控制器权限控制:
添加correct_user前置过滤器,仅允许帖子所有者操作:before_action :correct_user, only: [:edit, :update, :destroy] def update if @micropost.update(micropost_params) redirect_to @micropost.user, notice: "Micropost updated!" else render 'edit' end end private def correct_user # 从当前用户的帖子中查找,确保只有所有者能操作 @micropost = current_user.microposts.find_by(id: params[:id]) redirect_to root_path if @micropost.nil? end - 限制参数允许范围:
绝对不要允许修改user_id,避免更新时重置关联:def micropost_params params.require(:micropost).permit(:content) # 仅允许修改content字段 end - 检查更新测试代码:
确保登录的是帖子所属用户,参数仅传递内容:test "should update micropost" do login_as(@micropost.user) patch micropost_path(@micropost), params: { micropost: { content: "Updated content" } } assert_redirected_to @micropost.user @micropost.reload assert_equal "Updated content", @micropost.content end
3. 模型验证兜底检查
确认Micropost模型的关联和验证规则正确:
class Micropost < ApplicationRecord belongs_to :user # Rails 5+默认自动验证user存在 validates :content, presence: true, length: { maximum: 140 } end
内容的提问来源于stack exchange,提问作者JS3
相关产品推荐
相关产品推荐

