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
相关产品推荐
相关产品推荐

