Python 模拟调用的返回值__

Python 模拟调用的返回值__,python,mocking,Python,Mocking,我正在用Python编写单元测试,我想创建一个mock函数,在调用时返回另一个mock(由我指定) 以下是我尝试过的: my_mock = Mock() fn = Mock() fn.__call__ = Mock() fn.__call__.return_value = my_mock 但是当我调用fn()时,它返回一个不同的mock,可能是某个描述的默认值 知道我做错了什么吗?还有,有没有更整洁的方法?我希望能够编写类似于fn=MockFunction(my_mock)的东西,使用返回值参

我正在用Python编写单元测试,我想创建一个mock函数,在调用时返回另一个mock(由我指定)

以下是我尝试过的:

my_mock = Mock()
fn = Mock()
fn.__call__ = Mock()
fn.__call__.return_value = my_mock
但是当我调用
fn()
时,它返回一个不同的mock,可能是某个描述的默认值


知道我做错了什么吗?还有,有没有更整洁的方法?我希望能够编写类似于
fn=MockFunction(my_mock)
的东西,使用
返回值
参数:

mock_mock = Mock(return_value=my_mock)
从这个角度来看,期望代码正常工作是合理的。在一个示例中,文档对
\uuuu str\uuu
方法的作用与此基本相同,它的工作原理如下:

>>> mock = Mock()
>>> mock.__str__ = Mock()
>>> mock.__str__.return_value = 'fooble'
>>> str(mock)
'fooble'
但是,这只适用于大多数魔法方法,其适用的确切列表没有文档记录:

由于magic方法的查找方式与普通方法不同,因此专门实现了这种支持。这意味着只支持特定的魔术方法。受支持的列表几乎包括所有这些。如果您需要什么,请告诉我们

\uuuu调用\uuuu
恰好是列表中没有的神奇方法之一。相反,您需要使用mock本身的
return\u value
属性,或者向构造函数提供
return\u value
参数

fn = Mock()
fn.return_value = my_mock

# or

fn = Mock(return_value=my_mock)

哇,谢谢。我花了一个多小时试图弄明白这一点。@Pig哦,我弄明白了,但我想我还不够彻底!那一定是我困惑的原因,谢谢。