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扩展库,支持任意实例方法打桩能力:
- 在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'
- 替换原有打桩代码为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
相关产品推荐
相关产品推荐

