Как создать несколько экземпляров MagicMock

#python #python-unittest

#python #python-unittest

Вопрос:

Давайте предположим, что у меня есть класс, MyEntity который имеет атрибут id и метод do_something() , и класс, MyEntityProcessor у которого есть метод process_enities_list() , метод требует список объектов и выполняет некоторый вызов обработки do_something() для каждого объекта.

Я хочу протестировать process_entities_list() с помощью unittest и MagicMock. Я думаю, что в идеале код должен выглядеть примерно так

 class TestProcessor(unittest.TestCase):

    @mock.patch("MyEntity", autospec=True)
    def test_processing(self, MockEntity):
        entities = []
        for i in range(5):
            entities.append(MockEntity(id = i))

        result = process_entities_list(entities)

        for entity in entities:
            entity.do_something.assert_called_once()
  

Но MockEntity() всегда возвращается одна и та же копия объекта MagickMock, поэтому тест работает не так, как предполагалось.

Я могу заменить MockTree просто «Mock», но тогда я теряю преимущество проверки того, что тестируемый метод использует правильный интерфейс для связи с объектом.

Есть ли какой-нибудь способ исправить эту проблему?

Что-то не так с моим тестовым дизайном? Существует ли лучшая архитектура, облегчающая тестирование этого случая?

Комментарии:

1. Есть ли какая-либо причина, по которой вы не создали бы экземпляр Mock или MagicMock с spec=MockEntity помощью MockEntity set, вместо того, чтобы исправлять сам по себе класс?

2. Кажется, это работает, спасибо