Ruby功能测试中Mock方法如何满足非空约束并通过测试?
解决Minitest Mock后因issue_id非空约束导致的500错误
你的问题核心是Mock StepinHelper.create_issue 时只验证了调用次数,但没有返回控制器需要的issue_id,导致Application模型保存时触发非空约束异常。只需调整Mock的返回值,让它提供一个合法的issue_id即可,无需修改业务代码。
具体做法是在Mock方法时,通过returns指定返回一个包含有效id的对象(或直接返回id,取决于原方法的返回类型):
test "create application returns 200 with mocked create_issue" do # 模拟返回一个带有id的issue对象,匹配原方法的返回结构 mocked_issue = OpenStruct.new(id: 12345) StepinHelper.expects(:create_issue).once.returns(mocked_issue) # 发起POST请求,传入必要的参数 post create_application_path, params: { application: { # 这里填写你的应用模型所需的参数,除了issue_id(由Mock提供) name: "Test App", description: "Test Description" } } assert_response :success # 验证返回200响应 end
说明
- 如果原
StepinHelper.create_issue方法直接返回issue的ID(而非对象),可以简化为returns(12345) OpenStruct是Ruby内置的类,用来快速创建带有属性的对象,刚好匹配控制器中issue.id的调用方式- 这样Mock后,控制器会拿到带有合法id的issue实例,给Application设置
issue_id,满足数据库非空约束,从而正常保存并返回200响应
内容的提问来源于stack exchange,提问作者anyonymousgamer
相关产品推荐
相关产品推荐

