В Python, как я могу написать модульные тесты, которые могут получить доступ к приватным атрибутам, не подвергая их воздействию?
Я пытаюсь улучшить то, как я пишу свои приложения unit test для своих программ Python. В некоторых случаях я замечаю, что было бы очень полезно иметь доступ к закрытым членам, чтобы гарантировать, что метод работает правильно. Например, при попытке проверить метод для правильного поведения, у которого нет ожидаемого возвращаемого значения, отличного от None. Я знаю, что простой и неправильный способ сделать это - просто превратить частные атрибуты в защищенные атрибуты и проверить их непосредственно. Тем не менее, я хотел бы найти способ, который не выставляет интерфейс как можно больше.
Итак, как мне проверить приватные атрибуты в классах, не подвергая их в интерфейсе или, если применимо, лучший способ тестирования такого сценария, чтобы доступ к частным атрибутам не обязательно был необходим для правильного модульного тестирования?
Ответы
Ответ 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 не являются частными?