как использовать builtins.input для нескольких входов - PullRequest
2 голосов
/ 08 апреля 2019

В моем unittest у меня есть 2 подсказки в тесте.Я пытаюсь использовать 2 @patch("builtins.input"), но, похоже, он принимает только 1 из возвращаемых значений.

@patch("builtins.input")
@patch("builtins.input")
def test_setProfileName_modify_init_prompt_empty(self, paramName1, paramName2):
    paramName1.return_value = self.profileName_prod
    paramName2.return_value = self.profileName_dev


    a = c.ALMConfig(self.configType)
    self.assertTrue(a.setProfileName())
    self.assertEqual(a.getProfileName(), self.profileName_dev)
    self.assertEqual(a.profileName, self.profileName_dev)


    self.assertTrue(a.setProfileName())
    self.assertEqual(a.getProfileName(), self.profileName_prod)
    self.assertEqual(a.profileName, self.profileName_prod)

Вызов a.setProfileName() запросит 1 ввод с использованием вызова input() в моей функции.,В этом тесте он будет вызывать a.setProfileName() дважды.

  • При первом вызове a.setProfileName() я введу значение self.profileName_prod.
  • При втором вызовеэто, я бы ввел значение self.profileName_dev.

Но тест не пройден после второго случая a.setProfileName() (от второго до последнего assertEqual после второго вызова a.setProfileName()).

    self.assertEqual(a.getProfileName(), self.profileName_prod)

Причина сбоя в том, что a.getProfileName возвращает значение для self.profileName_dev вместо self.profileName_prod.

Я протестировал свой код в python cli, чтобы сделатьубедитесь, что поведение правильное.

Любая обратная связь приветствуется.

Спасибо, ребята!

Ответы [ 2 ]

4 голосов
/ 08 апреля 2019

Дважды добавив одну и ту же функцию, вы не получите разных значений при разных вызовах. Вы можете использовать атрибут side_effect объекта Mock, задав для него список значений, которые вы хотите, чтобы функция возвращала при последовательных вызовах:

from unittest.mock import patch
@patch('builtins.input', side_effect=['dev', 'prod'])
def test_input(mock_input):
    assert input() == 'dev'
    assert input() == 'prod'
test_input() # this will not raise an exception since all assertions are True
1 голос
/ 09 апреля 2019

Я пересмотрел решение blhsing, и оно намного элегантнее.Вот мой рабочий тестовый код:

@patch('builtins.input', side_effect=['dev', 'production'])
def test_setProfileName_modify_init_prompt_update_new(self, paramName):
    a = c.ALMConfig(self.configType)
    self.assertTrue(a.setProfileName())
    self.assertEqual(a.getProfileName(), self.profileName_dev)
    self.assertEqual(a.profileName, self.profileName_dev)


    self.assertEqual(a.getProfileName(), self.profileName_dev)
    self.assertTrue(a.setProfileName())
    self.assertEqual(a.getProfileName(), self.profileName_prod)
    self.assertEqual(a.profileName, self.profileName_prod)

Спасибо всем за ваши комментарии!:)

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