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

在Minitest(Ruby on Rails5)中如何断言Mock类方法已被调用?

在Minitest中断言无返回值类方法的调用(Ruby on Rails 5)

针对你遇到的场景,我来分享两种靠谱的方法,帮你验证WebsocketClient::Proxy.authenticate这个无返回值类方法是否被调用,同时也会说明如何检查Mock类方法的调用情况。

方法一:用Minitest Mock跟踪调用(推荐)

Minitest自带的Mock可以帮你明确期望方法的调用次数、参数,还能验证是否符合预期。因为你的authenticate是无返回值方法,所以我们在mock里指定返回nil即可:

test "authenticate method gets called during connect" do
  # 创建mock对象,期望authenticate被调用1次,参数是任意websocket对象
  auth_mock = Minitest::Mock.new
  # 第二个参数nil对应原方法的无返回值,第三个参数是期望的参数类型(用anything匹配任意值)
  auth_mock.expect(:authenticate, nil, [Minitest::Mock.anything])

  # 用stub替换原类方法,把调用转发给mock
  WebsocketClient::Proxy.stub(:authenticate, ->(ws) { auth_mock.authenticate(ws) }) do
    ws_client = WebsocketClient::Proxy.new(stratum_worker)
    ws_client.connect
    
    # 触发你的websocket消息逻辑
    msg = WebSocket::Frame::Incoming::Client.new
    msg.data = error_str
    ws_client.websocket.emit :message, msg
  end

  # 验证mock的期望是否被满足(如果没调用或调用次数不对,这里会报错)
  auth_mock.verify
end

方法二:用计数器变量快速验证

如果场景比较简单,不需要检查参数,只是想确认方法被调用过,可以用一个计数器变量来跟踪:

test "authenticate is triggered during connect" do
  auth_call_count = 0

  WebsocketClient::Proxy.stub(:authenticate, ->(ws) { auth_call_count += 1 }) do
    ws_client = WebsocketClient::Proxy.new(stratum_worker)
    ws_client.connect
    
    # 执行你的消息逻辑...
  end

  # 断言方法被调用了1次(根据你的业务调整次数)
  assert_equal 1, auth_call_count, "Proxy.authenticate should be called exactly once"
end

检查Minitest Mock类方法是否被调用

其实上面的方法一已经包含了验证逻辑,核心就是用mock.verify方法。如果你直接给类方法挂载了Mock,也可以这样做:

test "verify mock class method was called" do
  # 创建mock并设置期望
  mock = Minitest::Mock.new
  mock.expect(:call, nil, [Minitest::Mock.anything])

  # 替换类方法为mock的call方法
  WebsocketClient::Proxy.stub(:authenticate, mock) do
    # 执行会触发authenticate的代码
    WebsocketClient::Proxy.authenticate(some_ws_instance)
  end

  # 验证mock的期望是否达成
  mock.verify
end

注意:Minitest的stub是块级的,块结束后原方法会自动恢复,不会影响其他测试用例,这点很省心。

内容的提问来源于stack exchange,提问作者Dave

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:54:43