В Python, как мне написать модульные тесты, которые могут получить доступ к закрытым атрибутам, не раскрывая их? - PullRequest
14 голосов
/ 08 ноября 2011

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

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

Ответы [ 2 ]

20 голосов
/ 08 ноября 2011

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

. См. Также этот вопрос: Почему «приватные» методы Python на самом деле не приватны?

4 голосов
/ 09 ноября 2011

Я пойду в другом направлении ...

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

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

Избегать Неуместная близость между тестом и ТУ.

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