【发布时间】: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