RSpec控制器测试Scope计数接口返回0,预期为1问题排查
问题描述
我有如下控制器方法:
def count response = model.scope(params[:age]) render json: {count: response.count} end
该方法通过scope查询指定年龄的模型记录并返回计数,实际运行正常,但编写RSpec测试时出现问题。
我使用FactoryBot创建测试数据:
let(:model) {create(:model, age:20) }
测试代码如下:
it "calls endpoint and returns correct count" do get :method, params: {age:20} puts parsed_response end
我预期发送age=20的GET请求后,返回的count应为1,但parsed_response显示为0。请问是我对FactoryBot的理解有误,还是测试方式不正确?
问题排查与解决方案
这里有几个明确的问题,逐一修复即可解决:
请求动作名错误
控制器方法名为count,但测试里写了get :method,这会导致请求找不到正确的控制器动作,自然查不到数据。把:method改成:count:get :count, params: {age:20}FactoryBot延迟加载未触发
let是延迟加载机制,只有当你在测试代码里显式调用model变量时,FactoryBot才会创建这条测试数据。解决方式有两种:- 在请求前调用变量触发创建:
it "calls endpoint and returns correct count" do model # 触发数据创建 get :count, params: {age:20} puts parsed_response end - 改用
let!(带感叹号的版本会提前加载数据):let!(:model) {create(:model, age:20) } it "calls endpoint and returns correct count" do get :count, params: {age:20} puts parsed_response end
- 在请求前调用变量触发创建:
控制器内
model变量歧义
控制器里直接写model.scope(...),如果这里的model不是指代你的模型类(比如User、Post这类类名),而是某个实例变量,会导致scope调用错误。确保这里用的是模型类名,比如模型是User的话,应该写成:response = User.scope(params[:age])
调整完成后,测试就能正确返回count=1的结果。
内容的提问来源于stack exchange,提问作者aj soprano
相关产品推荐
相关产品推荐

