gpt4 book ai didi

Python 返回 MagicMock 对象而不是 return_value

转载 作者:IT老高 更新时间:2023-10-28 20:32:08 33 4
gpt4 key购买 nike

我有一个 Python 文件 a.py,其中包含两个类 AB

class A(object):
def method_a(self):
return "Class A method a"

class B(object):
def method_b(self):
a = A()
print a.method_a()

我想通过模拟 A 在类 B 中对 method_b 进行单元测试。以下是用于此目的的文件 testa.py 的内容:

import unittest
import mock
import a


class TestB(unittest.TestCase):

@mock.patch('a.A')
def test_method_b(self, mock_a):
mock_a.method_a.return_value = 'Mocked A'
b = a.B()
b.method_b()


if __name__ == '__main__':
unittest.main()

我希望在输出中得到 Mocked A。但我得到的是:

<MagicMock name='A().method_a()' id='4326621392'>

我哪里做错了?

最佳答案

当您@mock.patch('a.A') 时,您正在将待测代码中的类A 替换为mock_a

然后在 B.method_b 中设置 a = A(),现在是 a = mock_a() - 即 amock_areturn_value。由于你没有指定这个值,它是一个普通的 MagicMock;这也没有配置,所以在调用方法时会得到默认响应(又一个 MagicMock)。

相反,您想配置 mock_areturn_value 以具有适当的方法,您可以这样做:

mock_a().method_a.return_value = 'Mocked A' 
# ^ note parentheses

或者,也许更明确地说:

mock_a.return_value.method_a.return_value = 'Mocked A'

您的代码在 a = A (分配类,而不是创建实例)的情况下可以工作,因为那时 a.method_a() 会触发您的模拟方法。

关于Python 返回 MagicMock 对象而不是 return_value,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38199008/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com