Модульный тест Python - макетирование свойства класса - PullRequest
0 голосов
/ 19 декабря 2018

Я пришел из Java-фона и новичок в Python.В Java, если класс инициализирует свое собственное свойство, например (это плохо для модульного тестирования):

class TestMe {
    Logger logger;
    public TestMe() {
        this.logger = new Logger();
    }

    //...stuff
}

Я бы реорганизовал его, чтобы я мог предоставить ложную зависимость и протестировать класс без создания реального экземпляраLogger:

class TestMe {
    Logger logger;
    public TestMe(ILogger logger) {
        this.logger = logger;
    }

    //...stuff
}

Но python - это совсем другой язык, и может быть способ смоделировать это свойство без рефакторинга:

import Logger

class TestMe:
    def __init__(self):
        self.logger = Logger()

    # stuff

есть ли способ смоделировать Logger вышекласс python без рефакторинга?

1 Ответ

0 голосов
/ 19 декабря 2018

Да, есть.Вы можете просто переназначить переменную члена logger на то, что вам нужно.Обратите внимание, что в Python нет понятия private и public, поэтому вы можете сделать это.

В частности, вы можете присвоить ему объект Mock или MagicMock, который является специальным объектом, который выможет сделать некоторый самоанализ (например, убедившись, что self.logger был вызван / использован каким-то особым образом), а также является чистым способом «подделки» (вам не нужно реализовывать интерфейс Logger s, чтобы использовать их)

from unittest.mock import MagicMock
t = TestMe()
t.logger = MagicMock()
# run some tests that use t (and maybe the Logger)

Вы можете узнать больше о насмешках в Python здесь .

HTH.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...