以下功能从用户获取密码。我需要使用单元测试/(模拟)来测试它。
def create_auth():
username = '{user}'.format(user=getpass.getuser())
pwd = getpass.getpass()
auth_string = '{username}:{pwd}'.format(username=username, pwd=pwd)
return auth_string
我是python的新手,任何提示都会有所帮助
由于
答案 0 :(得分:6)
一般来说,您应该始终将用户输入与程序/业务逻辑分开。
def create_auth_interactive():
return create_auth(getpass.getuser(), getpass.getpass())
def create_auth(user, pwd):
username = '{user}'.format(user=user) # do you really need this line??
auth_string = '{username}:{pwd}'.format(username=username, pwd=pwd)
return auth_string
这使您的代码更易于维护:
您可以在不进行嘲笑的情况下进行单元测试。模拟是非常有用的,但是如果你发现随着时间的推移你需要嘲笑越来越多的东西,这很好地表明你的代码没有跟随separation of concerns。请查看dependency injection
使用输入值列表构建多个测试用例要容易得多(但有些人更愿意进行多项独立测试,请与您的团队/项目核实)
答案 1 :(得分:3)
使用mock.patch
:
class TestCreateAuth(unittest.TestCase):
@mock.patch('getpass.getpass')
@mock.patch('getpass.getuser')
def test_create_auth(self, getuser, getpw):
getuser.return_value = 'user'
getpw.return_value = 'pass'
self.assertEqual(create_auth(), 'user:pass')