如何模拟测试类的成员(对象列表)并在对象的方法上调用断言?

问题描述 投票:0回答:1

我有以下场景(简化):

项目结构:

├── 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()
python python-unittest python-unittest.mock
1个回答
1
投票

您应该能够通过用 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()
© www.soinside.com 2019 - 2024. All rights reserved.