python中mock的断言使用

33次阅读

答案:python中使用 unittest.mock 的断言方法验证模拟 对象 调用情况,如 assert_called_once_with 检查调用次数和参数。通过 @mock.patch 替换目标方法,结合 call_count 和 assert_any_call 可验证多次调用的参数,确保函数行为正确。

python 中 mock 的断言使用

在 Python 中使用 mock 进行断言,主要是为了验证模拟对象的方法是否被正确调用。常用的方法来自 unittest.mock 模块,比如 assert_called()assert_called_once()assert_called_with() 等。这些断言方法帮助我们检查函数或方法的调用情况。

1. 常见的 mock 断言方法

以下是常用的 mock 断言方法及其用途:

  • assert_called():确认方法至少被调用过一次。
  • assert_called_once():确认方法只被调用了一次。
  • assert_called_with(*args, **kwargs):确认最后一次调用时传入了指定的参数。
  • assert_any_call(*args, **kwargs):确认在某次调用中使用了指定的参数(不管是不是最后一次)。
  • assert_not_called():确认方法从未被调用。

2. 实际使用示例

假设有一个发送邮件的函数,我们想测试它是否正确调用了 send_email 方法。

from unittest import mock import unittest <p>def notify_user(email, message): send_email(email, message)  # 假设这是要 mock 的方法 </p><h1> 测试类 </h1><p>class TestNotification(unittest.TestCase):</p><p><span> 立即学习 </span>“<a href="https://pan.quark.cn/s/00968c3c2c15" style="text-decoration: underline !important; color: blue; font-weight: bolder;" rel="nofollow" target="_blank">Python 免费学习笔记(深入)</a>”;</p>                     <div class="aritcle_card">                         <a class="aritcle_card_img" href="/ai/%E6%99%BA%E8%B0%B1%E6%B8%85%E8%A8%80-%E5%85%8D%E8%">                             <img src="https://img.php.cn/upload/ai_manual/000/000/000/175679976181507.png" alt=" 智谱清言 - 免费全能的 AI 助手 ">                         </a>                         <div class="aritcle_card_info">                             <a href="/ai/%E6%99%BA%E8%B0%B1%E6%B8%85%E8%A8%80-%E5%85%8D%E8%"> 智谱清言 - 免费全能的 AI 助手 </a>                             <p> 智谱清言 - 免费全能的 AI 助手 </p>                             <div class="">                                 <img src="/static/images/card_xiazai.png" alt=" 智谱清言 - 免费全能的 AI 助手 ">                                 <span>2</span>                             </div>                         </div>                         <a href="/ai/%E6%99%BA%E8%B0%B1%E6%B8%85%E8%A8%80-%E5%85%8D%E8%" class="aritcle_card_btn">                             <span> 查看详情 </span>                             <img src="/static/images/cardxiayige-3.png" alt=" 智谱清言 - 免费全能的 AI 助手 ">                         </a>                     </div>                 <pre class='brush:python;toolbar:false;'>@mock.patch('my_module.send_email') def test_notify_user_calls_send_email(self, mock_send):     notify_user('user@example.com', 'Hello!')      mock_send.assert_called_once_with('user@example.com', 'Hello!')

在这个例子中,我们用 @mock.patch 替换了 send_email,然后通过assert_called_once_with 确保它被正确调用了一次,并且参数匹配。

3. 检查多次调用的情况

如果一个方法被调用多次,可以使用 call_args_list 来查看每次调用的参数。

def broadcast_message(emails, message):     for email in emails:         send_email(email, message) <p>@mock.patch('my_module.send_email') def test_broadcast_calls_multiple_times(mock_send): emails = ['a@example.com', 'b@example.com'] broadcast_message(emails, 'Hi all!')</p><pre class='brush:python;toolbar:false;'>assert mock_send.call_count == 2 mock_send.assert_any_call('a@example.com', 'Hi all!') mock_send.assert_any_call('b@example.com', 'Hi all!')

这里通过 call_count 判断调用次数,再用 assert_any_call 确认特定参数曾被使用。

基本上就这些。掌握这些断言方法能让你的单元测试更准确地验证行为。注意别忘了打 patch 的作用范围和 mock 对象的传递方式。不复杂但容易忽略细节。

站长
版权声明:本站原创文章,由 站长 2025-10-23发表,共计2467字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
1a44ec70fbfb7ca70432d56d3e5ef742
text=ZqhQzanResources