Подтвердить что ты не робот

В Python, как я могу написать модульные тесты, которые могут получить доступ к приватным атрибутам, не подвергая их воздействию?

Я пытаюсь улучшить то, как я пишу свои приложения unit test для своих программ Python. В некоторых случаях я замечаю, что было бы очень полезно иметь доступ к закрытым членам, чтобы гарантировать, что метод работает правильно. Например, при попытке проверить метод для правильного поведения, у которого нет ожидаемого возвращаемого значения, отличного от None. Я знаю, что простой и неправильный способ сделать это - просто превратить частные атрибуты в защищенные атрибуты и проверить их непосредственно. Тем не менее, я хотел бы найти способ, который не выставляет интерфейс как можно больше.

Итак, как мне проверить приватные атрибуты в классах, не подвергая их в интерфейсе или, если применимо, лучший способ тестирования такого сценария, чтобы доступ к частным атрибутам не обязательно был необходим для правильного модульного тестирования?

4b9b3361

Ответ 1

Я собираюсь уйти в другом направлении...

Попробуйте написать единичные тесты, которые утверждают публичное поведение по частному состоянию. Допустим, вы называете свой метод void void(), который изменяет внутреннее состояние. Теперь, если метод вызван и состояние изменится, в вашей маленькой кодовой вселенной будет наблюдаемое изменение. Возможно, B() теперь ведет себя по-другому. Таким образом, мой тест будет... (тривиализируя пример)

void MyTest()
{
   Assert.That(B(), Is.False);
   A();
   Assert.That(B(), Is.True);
}

Избегайте "Неплотная близость" между тестом и SUT.

Ответ 2

Ничто не является частным в Python. Если вы используете двойной символ подчеркивания для переменных-членов, это имя просто искажено. Вы можете получить к нему доступ, присвоив имя в форме _Class__member. Это приведет к доступу к переменной __member в классе Class.

Смотрите также этот вопрос: Почему "частные" методы Python не являются частными?