Python макет получения адреса вместо return_value

#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 это реализовано?