在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
相关产品推荐
相关产品推荐

