Как я могу макет объекта с вложенными атрибутами в Python? - PullRequest
0 голосов
/ 05 июня 2018

Я хочу смоделировать метод is_room_member, где invitee - строка, а occupants - список строк.

Если invitee = 'batman' и occupants = ['batman', 'superman'], метод is_room_member возвращает True.

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

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))

Ответы [ 2 ]

0 голосов
/ 05 июня 2018

Поскольку MagicMock настолько волшебен ... это именно то, что вы написали.

class Testing(unittest.TestCase):
    def test_is_room_member(self):
    occupants = ['batman', 'superman']
    msg = MagicMock()
    msg.frm.room.occupants = occupants
    print(msg.frm.room.occupants) # >>> ['batman', 'superman']
    self.assertTrue(Foo.is_room_member('batman', msg))

Из документов юнит-теста :

Mock и MagicMockобъекты создают все атрибуты и методы, когда вы обращаетесь к ним, и сохраняют детали того, как они использовались.

Если не сказать иначе, все возвращает MagicMock!

0 голосов
/ 05 июня 2018

Существует существующий ответ на ваш вопрос: Перемешивание вложенных свойств с помощью макета

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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...