hob*_*777 5 python unit-testing mocking python-3.x
我正在尝试测试一个类并模拟其方法之一,但我似乎无法用我的模拟行为替换其中一个实例方法的行为。我的代码是这样组织的:
--src
----module
------__init__.py
------my_class.py
--tst
----__init__.py
----test_my_class.py
my_class.py包含以下内容
class MyClass:
def __init__(self):
pass
def do_something(self):
return 'Real Output'
Run Code Online (Sandbox Code Playgroud)
我的测试文件test_my_class.py包含以下内容。
from unittest.mock import patch
from src.module.my_class import MyClass
def test_my_class():
my_class = MyClass()
assert my_class.do_something() == 'Real Output'
@patch('src.module.my_class.MyClass')
def test_mock_my_class(mock_my_class):
mock_my_class.return_value.do_something.return_value = 'Mocked Output'
my_class = MyClass()
assert my_class.do_something() == 'Mocked Output'
Run Code Online (Sandbox Code Playgroud)
第一个测试工作得很好(到目前为止没有涉及任何模拟)。然而,第二个测试给了我以下断言错误。我希望该do_something()方法被模拟并返回“模拟输出”,并且断言语句的计算结果为 true。我这里哪里出错了?
AssertionError: assert <bound method MyClass.do_something of <src.module.my_class.MyClass object at 0x1057133c8>> == 'Mocked Output'
E + where <bound method MyClass.do_something of <src.module.my_class.MyClass object at 0x1057133c8>> = <src.module.my_class.MyClass object at 0x1057133c8>.do_something
附言。我查阅了以下资源但没有成功:
最后一个链接一开始看起来特别有用,因为我几乎逐字地遵循其中一个示例,但它仍然不起作用。
@mock.patch("simple.SimpleClass")
def mock_simple_class(mock_class):
mock_class.return_value.explode.return_value = "BOO!"
inst = simple.SimpleClass()
result = inst.explode()
print(result)
Run Code Online (Sandbox Code Playgroud)
小智 1
解决这个问题更合适的方法是使用 patch.object
@patch.object(MyClass, "do_something")
def test_mock_my_class(m):
m.side_effect = ['Mocked Output']
my_class = MyClass()
assert my_class.do_something() == 'Mocked Output'
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5519 次 |
| 最近记录: |