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

时间:2019-04-08 18:54:41

标签: 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)

调用a.setProfileName()将使用我的函数中的input()调用提示输入1次。在此测试中,它将两次调用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中测试了我的代码,以确保行为正确。

任何反馈都值得赞赏。

谢谢大家!

3 个答案:

答案 0 :(得分:3)

对同一函数进行两次修补不会使它在不同的调用上返回不同的值。您可以通过将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 :(得分:1)

我重新考虑了blhsing的解决方案,它更加优雅。这是我现在可以工作的测试代码:

  it("should display an item", () => {
    const input = wrapper.find('[name="title"]')
    input.simulate("change", { target: { value: "Buy Bread" } })
    expect(input).toHaveValue("Buy Bread")
    //more code later
  })

感谢大家的评论! :)

答案 2 :(得分:1)

要为 2020 年及以后访问此网站的任何人提供更简单明了的答案,您可以这样做

dx

在 Python 3.8 之后。

要查看完整的易于理解的示例,请继续阅读,否则请停在这里。

完整示例: 下面的代码显示了一个完整的示例,其中包含一个名为“AnsweredQuestion”的类和一个单元测试

`with patch("builtins.input", return_value = "Whatever you want returned"):
   self.assertEqual("<Object>", "Whatever you want returned")
`

单元测试以测试类 `class AnsweredQuestion: def __init__(self): print("I hope you find this example helpful") def get_input(self): print("Enter your input") entered_data = input() print("You entered '" + entered_data + "'") return get_input `

AnsweredQuestion