如何将 builtins.input 用于多个输入

kiw*_*iwo 3 python unit-testing

在我的单元测试中,我在测试中有 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)
Run Code Online (Sandbox Code Playgroud)

该调用a.setProfileName()input()在我的函数中使用call提示输入 1 个。在这个测试中,它会调用a.setProfileName()两次。

  • 我第一次打电话时a.setProfileName(),我会输入 的值self.profileName_prod
  • 我第二次调用它时,我会输入self.profileName_dev.

但是在第二个a.setProfileName()案例之后测试失败(在第二assertEquala.setProfileName()调用之后的倒数第二个)。

    self.assertEqual(a.getProfileName(), self.profileName_prod)
Run Code Online (Sandbox Code Playgroud)

失败的原因是因为a.getProfileName正在返回值 forself.profileName_dev而不是self.profileName_prod

我已经在 python cli 中测试了我的代码以确保行为是正确的。

任何反馈表示赞赏。

谢谢你们!

blh*_*ing 5

两次修补相同的函数不会使其在不同的调用中返回不同的值。您可以通过使用您希望函数在连续调用中返回的值列表来设置它来使用对象的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
Run Code Online (Sandbox Code Playgroud)