如何用Mocha Minitest模拟带延迟响应的DynamoDB API调用?
模拟DynamoDB Scan延迟响应的Mocha Minitest实现
我需要在Mocha Minitest中模拟Lambda函数里的DynamoDB scan()调用,让它延迟指定时间后再返回响应。现有测试代码如下:
def test_lambda_handler_with_delayed_scan_response @dynamo_client = Aws::DynamoDB::Client.new( region: 'mock-region', access_key_id: 'aws-user', secret_access_key: 'aws-key' ) Aws::DynamoDB::Client.stubs(:new).returns(@dynamo_client) scan_params_1 = {some_key: "some_value"} response = {code: 200} @dynamo_client.stubs(:scan).with(scan_params_1).returns(response) lambda_handler(event: event, context: @context) # 验证lambda_handler的日志输出与预期文件匹配的额外逻辑 end
之前尝试过两种无效的实现方式:
方式一:
@dynamo_client.stubs(:scan).with(scan_params_1).returns(sleep 5; response)问题:
sleep 5会在测试初始化阶段直接执行,而非lambda_handler调用scan()时触发。方式二:
@dynamo_client.stubs(:scan).with(scan_params_1).returns(proc {sleep 5; response })问题:返回的是Proc对象,Lambda函数不会主动调用
proc.call()来触发延迟逻辑。
正确实现方式
利用Mocha stub的块语法,当被stub的方法被调用时,块内代码才会执行,同时块的返回值会作为方法的返回值返回:
def test_lambda_handler_with_delayed_scan_response @dynamo_client = Aws::DynamoDB::Client.new( region: 'mock-region', access_key_id: 'aws-user', secret_access_key: 'aws-key' ) Aws::DynamoDB::Client.stubs(:new).returns(@dynamo_client) scan_params_1 = {some_key: "some_value"} response = {code: 200} # 使用块语法实现延迟响应 @dynamo_client.stubs(:scan).with(scan_params_1) do sleep 5 response end lambda_handler(event: event, context: @context) # 验证lambda_handler的日志输出与预期文件匹配的额外逻辑 end
原理说明
Mocha允许为stub方法传入代码块,当scan()被lambda_handler调用时,才会执行块内的sleep 5逻辑,执行完成后返回response给调用方。这种方式既保证了延迟在正确时机触发,又能返回预期的响应结果,完美适配需求。
内容的提问来源于stack exchange,提问作者xwan
相关产品推荐
相关产品推荐

