API测试异常:传入无效参数返回:ok而非:unprocessable_entity求助
问题分析与修复方案
核心问题1:测试代码与目标接口不匹配
你要测试的是Update接口(Patch/Put请求),但当前测试代码用的是post units_url(对应Create接口),请求方式和接口路径都不对,导致实际测试的不是Update逻辑。
核心问题2:控制器误用update!方法
update!是会抛出异常的方法——当参数验证失败时,它不会返回false,而是直接抛出ActiveRecord::RecordInvalid异常。如果项目没有全局捕获并正确处理这个异常,Rails可能会默认返回200(或其他非预期状态码),永远走不到else分支里的错误响应逻辑。
额外检查点:验证规则与无效参数是否匹配
如果Unit模型没有对name设置验证规则(比如validates :name, presence: true),或者invalid_attributes并没有违反验证规则,那么即使参数“看起来无效”,update也会成功,自然返回200状态码。
修复步骤
修正测试代码,匹配Update接口
把请求方式改成patch或put,路径使用单数的unit_url(@unit)(需要先在测试中创建一个@unit实例):it "renders a JSON response with errors when updating unit" do patch unit_url(@unit), params: { unit: invalid_attributes }, headers: valid_headers, as: :json expect(response).to have_http_status(:unprocessable_entity) expect(response.content_type).to match(a_string_including("application/vnd.api+json")) end替换控制器中的
update!为update
改用不会抛出异常的update方法,这样验证失败时会返回false,进入错误响应分支:def update if @unit.update(unit_params) render json: @unit else render json: @unit.errors, status: :unprocessable_entity end end确保模型存在对应验证规则
检查Unit模型,确认对name设置了验证,比如:class Unit < ApplicationRecord validates :name, presence: true, length: { minimum: 2 } end确认
invalid_attributes确实违反验证
比如对应上面的验证,invalid_attributes应该是:let(:invalid_attributes) { { name: nil } } # 违反presence验证
内容的提问来源于stack exchange,提问作者VQV03
相关产品推荐
相关产品推荐

