如何验证Foo构造函数调用Bar构造函数并验证obj赋值?
问题分析与解决
你遇到的问题核心是Mock对象的层级搞混了:
mock_bar是被patch后的Bar类本身的Mock对象(对应代码里的Bar)- 而调用
Bar(1)时,返回的是mock_bar.return_value——这是Mock类被调用后生成的实例对象(对应代码里的Bar(1)执行结果)
所以你的断言拿result.obj(Bar(1)的返回值)和mock_bar(Bar类的Mock)比较,自然不相等。
修正后的测试代码
import pytest from unittest.mock import patch from mod import Foo, Bar @pytest.fixture def mock_bar(): with patch('mod.Bar') as mock: yield mock def test_foo(mock_bar): result = Foo() # 验证Bar类被以参数1调用过一次 mock_bar.assert_called_once_with(1) # 验证obj是Bar()调用后的返回值,即mock_bar的return_value assert result.obj == mock_bar.return_value
补充说明
- 用
patch替换Bar类后,所有对Bar()的调用都会返回mock_bar.return_value(默认是一个新的MagicMock实例) - 如果你想自定义
Bar()返回的对象,可以在测试里给mock_bar.return_value赋值,比如mock_bar.return_value = Mock()
内容的提问来源于stack exchange,提问作者lulalala
相关产品推荐
相关产品推荐

