我有一个自定义验证,用于检查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返回状态代码,那么我是否有理由从测试中得到相同的结果?
答案 0 :(得分:1)
我看到它的方式,update_attributes
引发异常,你需要抓住它。也许您正在使用浏览器进行XHR调用,并且您在前端编码处理异常代码(422)。要使测试起作用,您应该挽救异常并以渲染中的相关状态进行响应
rescue ActiveRecord::RecordInvalid do
render json: {
error: "Invalid params",
status: 422
},
status: 422
end