如何测试rails自定义验证

时间:2015-07-27 16:26:39

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

我有一个自定义验证,用于检查param是否是有效的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返回状态代码,那么我是否有理由从测试中得到相同的结果?

1 个答案:

答案 0 :(得分:1)

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

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