如何在 Python 中模拟具有嵌套属性的对象?

Hil*_*gar 6 python unit-testing mocking python-3.x

考虑以下代码:

class Foo:
    @staticmethod
    def is_room_member(invitee, msg):
        return invitee in msg.frm.room.occupants
Run Code Online (Sandbox Code Playgroud)

我想测试该方法is_room_member,其中invitee是一个字符串,并且 occupants是一个字符串列表。

如果invitee = 'batman'occupants = ['batman', 'superman']该方法is_room_member返回True

msg是需要模拟的对象,以便我可以测试这个方法。

我如何测试这个方法,因为它需要这个msg具有嵌套属性的对象?

我希望测试是这样的:

class Testing(unittest.TestCase):
    def test_is_room_member(self):
        occupants = ['batman', 'superman']
        # mocking 
        # msg = MagicMock()
        # msg.frm.room.occupants = occupants
        self.assertTrue(Foo.is_room_member('batman', msg))
Run Code Online (Sandbox Code Playgroud)

小智 9

您的问题已有答案: Mockingnestedpropertieswithmock

import unittest
import mock

class Foo:
    @staticmethod
    def is_room_member(invitee, msg):
        return invitee in msg.frm.room.occupants

class Testing(unittest.TestCase):
    def test_is_room_member(self):
        occupants = ['batman', 'superman']

        # mocking
        mocked_msg = mock.MagicMock()
        mocked_msg.frm.room.occupants = occupants

        self.assertTrue(Foo.is_room_member('batman', mocked_msg))

if __name__ == '__main__':
    unittest.main()
Run Code Online (Sandbox Code Playgroud)