【问题标题】:how to test rails custom validation如何测试 Rails 自定义验证
【发布时间】:2015-07-27 16:26:38
【问题描述】:

我有一个自定义验证来检查参数是否是有效的 JSON:

 def is_valid_json
    begin
      !!JSON.parse(preferences)
    rescue
      errors.add(:preferences, "This is not valid JSON")
    end
  end

在我的控制器测试中,我想确保当我发送一个错误的值时,响应的状态码是 422。这是来自我的控制器的规范:

  it 'should return a 422 when validations fail' do
    put :update, {:user_preferences => { :email => @email, :preferences => 'badval' } }
    expect(response.status).to eq(422)
    res = JSON.parse(response.body)
    expect(res['error']).to_not be_blank
  end

测试因错误而失败:

Failure/Error: put :update, {:user_preferences => { :email => @email, :preferences => 'badval' } }
ActiveRecord::RecordInvalid:
Validation failed: Preferences This is not valid JSON

控制器代码:

 def update
    @user_preference = UserPreference.where(email: params[:user_preferences][:email]).first
    authorize! :update, @user_preference
    @user_preference.update_attributes!(params[:user_preferences])
    render_api_response(@user_preference)
  end

当我从浏览器发出请求时,我得到一个 422 返回状态码,那么我是否有理由无法从测试中得到相同的结果?

【问题讨论】:

  • 能否添加控制器代码以及在测试环境中初始化记录的方式?

标签: ruby-on-rails-3 validation activerecord rspec


【解决方案1】:

在我看来,update_attributes 引发了一个异常,你需要抓住它。也许您正在使用浏览器进行 XHR 调用,并且您的代码在前端处理该异常代码 (422)。为了使测试正常工作,您应该挽救异常并在渲染中以相关状态进行响应

rescue ActiveRecord::RecordInvalid do
  render json: {
    error: "Invalid params",
    status: 422
    },
    status: 422
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-06
    • 1970-01-01
    • 1970-01-01
    • 2010-12-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多