You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rails MiniTest stub模块方法返回固定值50不生效如何解决?

Minitest Stub失效问题修复方案

Minitest完全支持模块级方法的stub操作,你遇到的失效问题是测试代码本身的多处逻辑错误导致的:

  • stub作用域内未执行被测业务逻辑
    你仅在stub代码块中验证了被stub方法的返回值,没有调用CashTransactions::DistributeFunds服务的call方法,CashTransaction表不会生成任何新记录,后续的数据库断言自然失败。
  • 断言方法使用错误
    你用assert 方法调用, 期望值的写法不符合Minitest的API规范:普通assert仅判断第一个参数的布尔值是否为真,第二个参数是断言失败时的自定义提示信息,不会做等值判断。等值判断需要用assert_equal 期望值, 实际值。
  • 前置refute调用参数不合法
    你调用原calculate_amount_distribution方法时没有传入要求的user、amount两个入参,会直接抛出参数数量不匹配的错误,无法执行到后续stub逻辑。
  • 数据库查询条件写错
    被测服务创建CashTransaction时,分配的金额存入funds字段,你断言时用amount字段作为查询条件,永远无法匹配到对应记录。

修正后的测试代码

test 'create CashTransaction records' do
  # 提前构造测试依赖的用户对象,可根据你的实际模型字段补充初始化参数
  user1 = User.create!
  user2 = User.create!
  test_amount = 100

  CashTransactionSettings.stub :calculate_amount_distribution, 50 do
    # 执行被测服务核心逻辑
    CashTransactions::DistributeFunds.new(users: [user1, user2], amount: test_amount).call

    # 验证stub生效
    assert_equal 50, CashTransactionSettings.calculate_amount_distribution(user1, test_amount)
    assert_equal 50, CashTransactionSettings.calculate_amount_distribution(user2, test_amount)

    # 修正查询字段为funds
    assert_equal 1, CashTransaction.where(user: user1, funds: 50).size
    assert_equal 1, CashTransaction.where(user: user2, funds: 50).size
  end
end

内容的提问来源于stack exchange,提问作者mr_muscle

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 15:36:02