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

Minitest测试Ruby Lambda handler时allow_any_instance_of未定义报错

报错原因

allow_any_instance_of是RSpec Mock框架的专属语法,原生Minitest没有内置该方法,直接调用就会触发未定义方法报错。
另外你现有测试代码还有两个隐藏问题也需要修复:

  • assert_response是Rails控制器测试专属方法,不能直接用来校验Lambda返回的哈希结果
  • 你测试里打桩的Parsers::IncomingEvents::CreateQuiz类和业务代码里实际使用的Parsers::IncomingEvents类名不匹配,打桩不会生效
解决方案

方案一:集成mocha gem实现实例打桩(最常用,改动最小)

mocha是Minitest生态最常用的Mock扩展库,支持任意实例方法打桩能力:

  1. 在Gemfile中添加测试依赖:
gem 'mocha', group: :test

执行bundle install安装依赖。
2. 调整测试文件头部的引入代码,新增mocha的引入:

require 'pry'
require 'minitest/autorun'
require 'active_support'
require 'mocha/minitest' # 新增这行

require_relative '../../src/Quiz_create/app'
  1. 替换原有打桩代码为mocha语法,同时修正类名和断言逻辑:
test 'lambda_handler' do
  # 修正类名和打桩语法
  Parsers::IncomingEvents.any_instance.stubs(:call)
  LN::Api.any_instance.stubs(:create_quiz) # 匹配业务代码里的create_quiz方法
  Responses::CreateQuiz.any_instance.stubs(:call)

  result = lambda_handler(event: event, context: '')
  assert_equal 200, result[:statusCode]
end

方案二:使用Minitest原生能力实现(无需额外依赖)

如果不想引入第三方gem,可以通过stub类的new方法返回mock实例实现相同效果:

test 'lambda_handler' do
  # 打桩Parsers::IncomingEvents
  mock_incoming_parser = mock
  mock_incoming_parser.stubs(:call)
  Parsers::IncomingEvents.stubs(:new).returns(mock_incoming_parser)

  # 打桩LN::Api
  mock_ln_api = mock
  mock_ln_api.stubs(:create_quiz)
  LN::Api.stubs(:new).returns(mock_ln_api)

  # 打桩Responses::CreateQuiz
  mock_resp_builder = mock
  mock_resp_builder.stubs(:call)
  Responses::CreateQuiz.stubs(:new).returns(mock_resp_builder)

  result = lambda_handler(event: event, context: '')
  assert_equal 200, result[:statusCode]
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.09.24 08:54:06