#python #unit-testing #mocking #return-value
#python #модульное тестирование #издевательство #возвращаемое значение
Вопрос:
Я пытаюсь выполнить вызов, чтобы проверить полное имя пользователя. Для этого я написал приведенный ниже метод, используя макет.
def test_UserDisplayName(self):
appModel = Mock()
eval = appModel.eval.return_value
eval.userDisplayName.return_value = 'JohnDoe'
self._SummaryModel.AppModel = appModel
actual = self._SummaryModel.UserDisplayName()
self.assertEqual(actual, 'JohnDoe')
Это метод, который он вызывает.
def UserDisplayName(self):
return self.AppModel().eval().userDisplayName()
Если я подключил отладчик к приведенной выше строке и запустил его в оболочке, он работает
[PAUSED] >>> self.AppModel().eval().userDisplayName()
'JohnDoe'
[PAUSED] >>>
Но когда запуск тестового примера для него завершается неудачно, я получаю адрес обратно, а не значение.
======================================================================
FAIL: test_UserDisplayName (unittests.model.SummaryModelTest)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/unittests/summary_model.py", line 112, in test_UserDisplayName
self.assertEqual(actual, 'JohnDoe')
AssertionError: <Mock name='mock.userDisplayName()' id='233406864'> != 'JohnDoe'
----------------------------------------------------------------------
Ran 1 test in 0.010s
FAILED: (failures=1)
Что я делаю не так?
Ответ №1:
Ваш код AppModel
также вызывает вызовы, поэтому вам нужно настроить другие ссылки для этого:
eval = appModel.return_value.eval.return_value
ДЕМОНСТРАЦИЯ:
>>> from unittest.mock import Mock
>>> appModel = Mock()
>>> eval = appModel.return_value.eval.return_value
>>> eval.userDisplayName.return_value = 'JohnDoe'
>>> appModel().eval().userDisplayName()
'JohnDoe'
Однако ваш <Mock name='mock.userDisplayName()' id='233406864'>
объект показывает имя mock.userDisplayName()
, которое предполагает, что возвращаемое значение было получено с помощью self.AppModel.userDisplayName()
прямого использования.
Комментарии:
1. Добавлена строка выше, но она все равно не работает, и когда я подключаю точку отладки, она тоже не работает.
code
[ПАУЗА] >>> self. AppModel().eval().userDisplayName() <Макет name=’макет.eval().userDisplayName()’ id= ‘232555600’> [ПРИОСТАНОВЛЕНО] >>>2. @Eamonn: протестируйте каждый отдельный шаг этого выражения и посмотрите, возвращается ли тот же макет , что и в вашем тесте. Так что же
self.AppModel()
возвращаетappModel.return_value
?3. Я добавляю
dir()
каждый шаг, поэтому я начал сself.AppModel()
того, что вижу'eval'
, а затем, когда я делаюdir()
self.AppModel().eval()
, я вижу userDisplayName.4. @Eamonn: глядя на ваш
AssertionError
, я не вижу ожидаемогоmock().eval().userDisplayName()
имени для макета. Вы уверены в том, какUserDisplayName
это реализовано?