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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 05:11:16