我有以下场景(简化):
项目结构:
├── main.py
├── README.md
├── src
│ ├── __init__.py
│ ├── member.py
│ └── myclass.py
└── tests
├── __init__.py
└── test_myclass.py
# myclass.py
from .member import Member
class MyClass():
members = []
def __init__(self, one, *args):
self.one = one
for arg in args:
self.members.append(Member(arg))
def some_method(self, arg):
[member.some_method(arg) for member in self.members]
# member.py
class Member:
def __init__(self, arg):
self.prop = arg
def __repr__(self):
return f'{self.prop}'
def some_method(self, arg):
print(f'[!] {repr(self)}')
作为一个测试用例,我想断言
some_method
是为 MyClass.memebers 中的每个成员调用的。
我尝试使用 Mock、MagicMock 进行模拟 src.myclass.MyClass.members
,最后使用传递的成员列表(下面的示例)。我真的很难弄清楚我该如何做到这一点。
# test_myclass.py
import unittest
from unittest.mock import patch
from src.myclass import MyClass
from src.member import Member
class MyClassTest(unittest.TestCase):
def test_myclass_some_method(self):
with patch('src.myclass.MyClass.members', new=[
Member('ten'),
Member('eleven'),
Member('thirteen')
]) as mock_members:
MyClass.some_method(MyClass, 'four')
# This is where I want to assert_called on Member
mock_members[0].assert_called()
if __name__ == "__main__":
unittest.main()
您应该能够通过用 Magic Mock 替换每个成员来测试这一点,然后测试该方法是否已被调用:
class MyClassTest(unittest.TestCase):
def test_myclass_some_method(self):
with patch('src.myclass.MyClass.members', new=[
MagicMock(),
MagicMock(),
MagicMock()
]) as mock_members:
MyClass.some_method(MyClass, 'four')
# This is where I want to assert_called on Member
mock_members[0].some_method.assert_called()