在单元测试中,我在测试中有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中测试了我的代码,以确保行为正确。
任何反馈都值得赞赏。
谢谢大家!
答案 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